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

多線程入門系列(四):Thread.Join 線程插入與等待機制

     編輯:關於C#

Join 核心功能

Thread.Join() 讓呼叫線程阻塞,直到目標線程結束(正常返回或拋出未捕獲異常)。實現「線程插入」效果:主線程等待子線程完成再繼續。

多載方法

方法說明
Join()無限期等待
Join(TimeSpan)等待指定時間,超時返回 false
Join(int milliseconds)等待指定毫秒,超時返回 false

基本使用範例

using System;
using System.Threading;

class JoinDemo
{
    static void Main()
    {
        Console.WriteLine("主線程開始: {0}", DateTime.Now.TimeOfDay);
        
        Thread t1 = new Thread(Work) { Name = "Worker-1" };
        Thread t2 = new Thread(Work) { Name = "Worker-2" };
        
        t1.Start();
        t2.Start();
        
        Console.WriteLine("主線程等待 t1 結束...");
        t1.Join(); // 阻塞直到 t1 結束
        
        Console.WriteLine("t1 結束,等待 t2 (最多 2 秒)...");
        bool finished = t2.Join(TimeSpan.FromSeconds(2));
        
        if (finished)
            Console.WriteLine("t2 正常結束");
        else
            Console.WriteLine("t2 超時未結束,主線程繼續");
        
        Console.WriteLine("主線程結束: {0}", DateTime.Now.TimeOfDay);
    }
    
    static void Work()
    {
        Thread.Sleep(3000); // 模擬工作 3 秒
        Console.WriteLine("{0} 完成", Thread.CurrentThread.Name);
    }
}

進階:多線程等待策略

逐個 Join(串行等待)

foreach (var t in threads) t.Join();

使用 WaitHandle 並行等待

WaitHandle[] handles = threads.Select(t => (WaitHandle)t).ToArray();
// WaitHandle.WaitAll(handles); // .NET Framework 不支援 Thread 直接 WaitAll
// 需自行包裝 ManualResetEvent 或改用 Task

現代替代:Task.WaitAll

var tasks = new Task[3];
for (int i = 0; i < 3; i++) 
    tasks[i] = Task.Run(() => Work(i));
Task.WaitAll(tasks); // 並行等待,更簡潔高效

Join 內部機制

  • 呼叫 Join 的線程進入 WaitSleepJoin 狀態。
  • 目標線程結束時,CLR 喚醒等待者。
  • 若目標線程已結束,Join 立即返回。
  • 注意:若目標線程持有鎖,呼叫端在 Join 時會阻塞,可能導致死鎖。

常見陷阱

陷阱後果解決
主線程 Join UI 線程UI 凍結、死鎖用 async/await、BackgroundWorker、Task.Run
互相 Join死鎖避免循環等待,重構架構
Join 已中止線程拋出 ThreadStateException檢查 ThreadState 或捕獲異常

圖示說明

(原文包含兩張圖片,展示 Join 阻塞喚醒流程、串行/並行等待對比)

Join 阻塞喚醒機制 多線程等待策略對比
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved