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

多線程入門系列(二):Thread 類別完整操作指南

     編輯:關於C#

21.2 Thread 類別核心成員

建構子

建構子說明
Thread(ThreadStart)無參數執行緒
Thread(ParameterizedThreadStart)帶物件參數執行緒

關鍵屬性

屬性說明
Name線程名稱(僅可設定一次,除錯極重要)
Priority優先級
IsBackground背景線程旗標
ThreadState當前狀態旗標組合
ManagedThreadId唯一識別碼(唯讀)
IsAlive是否啟動且未結束
IsThreadPoolThread是否為線程池線程
CurrentCulture/UIculture執行緒文化特性

關鍵方法

方法說明
Start()啟動線程
Start(object)啟動帶參數線程
Join()等待結束
Sleep(ms)靜態方法,讓當前線程睡眠
Abort()已過時/不建議,強制中止
Interrupt()喚醒阻塞線程(拋出 ThreadInterruptedException)
GetDomain()取得當前應用程式域
GetData/SetData線程區域儲存 (TLS)

基本建立與啟動範例

using System;
using System.Threading;

class ThreadBasicDemo
{
    static void Main()
    {
        // 無參數
        Thread t1 = new Thread(Work);
        t1.Name = "Worker-1";
        t1.Start();
        
        // 帶參數
        Thread t2 = new Thread(WorkWithParam);
        t2.Name = "Worker-2";
        t2.Start("Hello Parameter");
        
        t1.Join(); t2.Join();
        Console.WriteLine("主線程結束");
    }
    
    static void Work()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("{0}: {1}", Thread.CurrentThread.Name, i);
            Thread.Sleep(100);
        }
    }
    
    static void WorkWithParam(object param)
    {
        Console.WriteLine("{0} 收到參數: {1}", Thread.CurrentThread.Name, param);
    }
}

參數傳遞最佳實務

避免使用 ParameterizedThreadStart 的 object 裝箱/拆箱,改用 Lambda 捕獲區域變數(強型別、無裝箱):

string msg = "Hello Lambda";
Thread t = new Thread(() => WorkWithString(msg));
t.Start();

void WorkWithString(string s) { Console.WriteLine(s); }

前景/背景線程行為差異

Thread fg = new Thread(() => { Thread.Sleep(1000); Console.WriteLine("前景結束"); });
Thread bg = new Thread(() => { Thread.Sleep(1000); Console.WriteLine("背景結束"); }) { IsBackground = true };

fg.Start(); bg.Start();
// 主線程結束時:前景線程會繼續執行完成,背景線程被強制終止(不印出「背景結束」)

線程區域儲存 (TLS)

// 設定
Thread.SetData(Thread.GetNamedDataSlot("MySlot"), "Thread-Local Value");
// 取得
string val = (string)Thread.GetData(Thread.GetNamedDataSlot("MySlot"));

.NET 4+ 建議使用 ThreadLocal<T>:

ThreadLocal<string> tls = new ThreadLocal<string>(() => "Initial-" + Thread.CurrentThread.ManagedThreadId);

圖示說明

(原文包含五張圖片,展示 Thread 類別結構、建構子差異、Start/Join 流程、前景背景差異、TLS 概念)

Thread 類別核心結構 建構子與參數傳遞 Start/Join 執行流程 前景/背景線程差異 ThreadLocal TLS 示意
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved