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

多線程入門系列(五):線程狀態完整生命週期

     編輯:關於C#

ThreadState 列舉與狀態轉換

.NET 線程狀態由 System.Threading.ThreadState 旗標列舉表示,可組合多重狀態。

核心狀態值

狀態數值說明
Unstarted0建立但未呼叫 Start()
Running0正在執行(實際無此旗標,Running = 0 且非其他狀態)
WaitSleepJoin1阻塞於 Wait/Sleep/Join
SuspendRequested2請求暫停(已過時)
Suspended4已暫停(已過時)
AbortRequested128請求中止
Aborted256已中止
Stopped16正常結束
Background4背景線程旗標(可組合)

狀態轉換圖

建立 Thread 實例
        ↓
   [Unstarted]
        ↓ Start()
   [Running] ←→ [WaitSleepJoin] (Sleep/Wait/Join)
        ↓                      ↑
   [AbortRequested]          │ (喚醒/超時)
        ↓                      │
   [Aborted]                  │
        ↓                      │
   [Stopped] ←────────────────┘
        ↑
   (正常返回/拋出未捕獲異常)

狀態檢測範例

using System;
using System.Threading;

class ThreadStateDemo
{
    static void Main()
    {
        Thread t = new Thread(Work);
        PrintState("建立後", t);
        
        t.Start();
        Thread.Sleep(50); // 確保啟動
        PrintState("Start 後", t);
        
        t.Join();
        PrintState("Join 後", t);
    }
    
    static void Work()
    {
        Thread.Sleep(1000); // 進入 WaitSleepJoin
    }
    
    static void PrintState(string label, Thread t)
    {
        Console.WriteLine("{0}: {1} (值={2})", label, t.ThreadState, (int)t.ThreadState);
        // 解析組合旗標
        if ((t.ThreadState & ThreadState.Background) != 0)
            Console.WriteLine("  -> 背景線程");
    }
}

關鍵狀態轉換操作

操作來源狀態目標狀態備註
Start()UnstartedRunning只能呼叫一次
Sleep()RunningWaitSleepJoin釋放 CPU,保留鎖
Wait()Running (持有鎖)WaitSleepJoin釋放鎖並等待
Join()RunningWaitSleepJoin等待目標線程結束
Abort()任意AbortRequested → Aborted → Stopped引發 ThreadAbortException,不建議使用
正常返回RunningStopped執行緒函數結束
未捕獲異常RunningStopped進程可能終止(.NET 2.0+)

背景線程 vs 前景線程

  • 前景線程:預設。進程會等待所有前景線程結束才退出。
  • 背景線程:t.IsBackground = true。所有前景線程結束時,進程強制終止背景線程(不執行 finally/finalizer)。

已過時 API 警告

Suspend()/Resume() 已標記 [Obsolete],極易造成死鎖(暫停時可能持有鎖),嚴禁使用。

圖示說明

(原文包含兩張圖片,展示 ThreadState 旗標組合邏輯、狀態轉換狀態機圖)

ThreadState 旗標組合 線程狀態轉換狀態機
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved