首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 程式設計總結(二):多執行緒基礎核心概念與 Thread 類別詳解

     編輯:關於C#

前言

多執行緒是提升應用程式回應性與資源利用率的關鍵技術。本文從進程與執行緒的區別、多執行緒優勢、應用場合、核心類別 `Thread` 的建構與控制、計時器、前景/背景執行緒等基礎面向完整建構知識體系。

一、進程與執行緒

概念進程執行緒
定義資源配置基本單位(PCB、程式碼段、資料段)CPU 排程基本單位(輕量級進程)
資源獨立位址空間共享進程位址空間,僅擁有堆疊、暫存器、執行緒 ID
切換開銷大(切換位址空間)小(共享位址空間)
關係至少包含一個主執行緒,可建立多個子執行緒隸屬於單一進程

二、多執行緒優勢

  1. 提升回應性:耗時作業移至背景,UI 執行緒保持流暢。
  2. 發揮多核效能:作業系統將執行緒分派至不同核心並行執行。
  3. 改善程式結構:複雜流程拆解為獨立執行緒,邏輯更清晰。

代價: 同步複雜度、死結風險、除錯困難、上下文切換開銷。

三、應用場合

  • 多執行緒處理同類任務(並行下載、批次運算)。
  • 單一任務拆解為獨立子步驟並行(管線式處理)。

四、經典入門案例:搬運工

多位搬運工(執行緒)並行搬運共同貨堆(共享資源),展示 `Thread.Start`、`ParameterizedThreadStart`、共享靜態欄位競爭(未加同步,僅示範基本啟動)。

public class Mover {
    public static int GoodsTotal = 200;
    public static int IntervalTime = 10;
    public string Name { get; set; }
    public int LaborAmount { get; set; }
    public void Move() {
        while (GoodsTotal > 0) {
            GoodsTotal -= LaborAmount;
            Console.WriteLine($"{Name} 搬運 {LaborAmount} 於 {DateTime.Now.Millisecond}");
            Thread.Sleep(IntervalTime);
        }
    }
}
// 啟動
new Thread(new ThreadStart(m1.Move)).Start();
new Thread(new ParameterizedThreadStart(m2.Move)).Start(10);

五、Thread 類別核心成員

  • Start():將執行緒狀態轉為 `Running`,由 OS 排程執行。
  • Sleep(ms):讓出剩餘時間片,阻塞指定毫秒。
  • Interrupt():喚醒處於 `WaitSleepJoin` 狀態的執行緒(拋出 `ThreadInterruptedException`)。
  • Join():阻塞呼叫執行緒直到目標執行緒結束。
  • Abort():強制終止(不建議使用,可能導致資料不一致)。
  • Priority:`Lowest` ~ `Highest`,僅影響排程相對優先權。

六、建立執行緒的四種方式

// 1. ThreadStart 無參數委派
new Thread(new ThreadStart(Method)).Start();

// 2. ParameterizedThreadStart 有參數委派
new Thread(new ParameterizedThreadStart(MethodWithParam)).Start(arg);

// 3. 匿名委派
new Thread(delegate { /* ... */ }).Start();

// 4. Lambda 運算式
new Thread(() => { /* ... */ }).Start();

// 5. 直接指定方法群組 (C# 2.0+)
new Thread(Method).Start();

七、計時器

`System.Threading.Timer` 於執行緒池執行回呼,適合週期性背景工作。支援變更週期、一次性觸發、取消。

TimerCallback cb = state => { /* 週期性工作 */ };
Timer timer = new Timer(cb, null, dueTime: 1000, period: 250);
// 5 秒後改為 500ms 週期
Thread.Sleep(5000);
timer.Change(0, 500);
// 5 秒後銷毀
Thread.Sleep(5000);
timer.Dispose();

八、前景執行緒 vs 背景執行緒

  • 前景執行緒:預設值。進程需等待所有前景執行緒結束才退出。
  • 背景執行緒:`IsBackground = true`。所有前景執行緒結束時,進程立即終止,背景執行緒被強制中止。

原則: 監聽、非關鍵背景任務設為背景;關鍵業務、需釋放資源的任務保持前景。

// 測試差異
for (int i=0; i<10; i++) {
    var t = new Thread(() => { Thread.Sleep(20000); });
    t.IsBackground = true; // 註解此行觀察前景行為
    t.Start();
}
Console.WriteLine("主執行緒結束");

總結

掌握 `Thread` 基礎操作、生命週期、優先權與前背景特性,是進階多執行緒程式設計(同步、執行緒池、Task、async/await)的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved