# 高薪必备-线程

#### 1、线程分类

<div class="qwen-markdown-table-wrap qwen-markdown-table-wrap-pc group relative w-full" id="bkmrk-%E7%B1%BB%E5%9E%8B-%E6%8F%8F%E8%BF%B0-%E4%B8%BB%E7%BA%BF%E7%A8%8B%EF%BC%88main-threa"><div class="scrollbar-hidden relative max-w-full overflow-x-auto whitespace-nowrap rounded-lg"><table border="1" class="qwen-markdown-table w-full max-w-full table-auto rounded-xl text-left text-sm text-gray-500 dark:text-gray-400 align-left" style="border-collapse: collapse; border-width: 1px;"><thead class="qwen-markdown-table-thead border-none bg-gray-50 text-xs uppercase text-gray-700 dark:bg-gray-850 dark:text-gray-400"><tr class="qwen-markdown-table-thead-tr"><th class="qwen-markdown-table-thead-tr-th cursor-pointer select-none border border-gray-50 dark:border-gray-850" data-spm-anchor-id="a2ty_o01.29997173.0.i112.2968c921YQj6Xt" scope="col" style="border-width: 1px;"><div class="qwen-markdown-table-thead-tr-th-col flex items-center gap-1.5">类型</div></th><th class="qwen-markdown-table-thead-tr-th cursor-pointer select-none border border-gray-50 dark:border-gray-850" scope="col" style="border-width: 1px;"><div class="qwen-markdown-table-thead-tr-th-col flex items-center gap-1.5">描述</div></th></tr></thead><tbody class="qwen-markdown-table-tbody"><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">主线程（Main Thread）</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">应用程序启动时的第一个线程</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">后台线程（Background Thread）</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">不阻止程序退出</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">前台线程（Foreground Thread）</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">阻止程序退出，直到完成</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">池化线程（Thread Pool Threads）</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">由 .NET 线程池管理</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">显式线程（new Thread()）</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">手动创建和控制的线程</div></td></tr></tbody></table>

</div></div>#### 2、线程的生命周期状态

<div class="qwen-markdown-table-wrap qwen-markdown-table-wrap-pc group relative w-full" id="bkmrk-%E7%8A%B6%E6%80%81-%E5%90%AB%E4%B9%89-unstarted-%E5%B7%B2%E5%88%9B%E5%BB%BA%E4%BD%86"><div class="scrollbar-hidden relative max-w-full overflow-x-auto whitespace-nowrap rounded-lg"><table border="1" class="qwen-markdown-table w-full max-w-full table-auto rounded-xl text-left text-sm text-gray-500 dark:text-gray-400 align-left" style="border-collapse: collapse; border-width: 1px;"><thead class="qwen-markdown-table-thead border-none bg-gray-50 text-xs uppercase text-gray-700 dark:bg-gray-850 dark:text-gray-400"><tr class="qwen-markdown-table-thead-tr"><th class="qwen-markdown-table-thead-tr-th cursor-pointer select-none border border-gray-50 dark:border-gray-850" data-spm-anchor-id="a2ty_o01.29997173.0.i120.2968c921YQj6Xt" scope="col" style="border-width: 1px;"><div class="qwen-markdown-table-thead-tr-th-col flex items-center gap-1.5">状态</div></th><th class="qwen-markdown-table-thead-tr-th cursor-pointer select-none border border-gray-50 dark:border-gray-850" scope="col" style="border-width: 1px;"><div class="qwen-markdown-table-thead-tr-th-col flex items-center gap-1.5">含义</div></th></tr></thead><tbody class="qwen-markdown-table-tbody"><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">Unstarted</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">已创建但尚未启动</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">Running</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">正在运行</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">WaitSleepJoin</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">调用了`Wait`,`Sleep`,`Join`</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">Suspended</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">已挂起（不推荐使用）</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">Aborted</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">线程已请求终止</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">Stopped</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" style="border-width: 1px;"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">线程已结束</div></td></tr></tbody></table>

</div><div class="qwen-markdown-table-thead-tool invisible group-hover:visible"></div></div>#### <button class="rounded-lg bg-transparent transition leading-[20px]">3、</button>线程的常用属性和方法

<div class="qwen-markdown-table-wrap qwen-markdown-table-wrap-pc group relative w-full" id="bkmrk-isbackground-%E6%98%AF%E5%90%A6%E4%B8%BA%E5%90%8E%E5%8F%B0%E7%BA%BF%E7%A8%8B"><div class="scrollbar-hidden relative max-w-full overflow-x-auto whitespace-nowrap rounded-lg"><table class="qwen-markdown-table w-full max-w-full table-auto rounded-xl text-left text-sm text-gray-500 dark:text-gray-400"><tbody class="qwen-markdown-table-tbody"><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]" data-spm-anchor-id="a2ty_o01.29997173.0.i123.2968c921YQj6Xt">`IsBackground`</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">是否为后台线程</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">`Priority`</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">设置线程优先级（High/AboveNormal/Normal 等）</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">`Start()`/`Join()`/`Abort()`/`Sleep()`</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">控制线程行为</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">`CurrentThread`</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">获取当前线程对象</div></td></tr><tr class="qwen-markdown-table-tbody-tr bg-white text-xs dark:border-gray-850 dark:bg-gray-900"><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white" data-spm-anchor-id="a2ty_o01.29997173.0.i125.2968c921YQj6Xt"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">`Name`</div></td><td class="qwen-markdown-table-tbody-tr-td w-max border border-gray-50 text-gray-900 dark:border-gray-850 dark:text-white"><div class="qwen-markdown-table-tbody-tr-td-col flex items-center gap-[2px]">给线程命名，方便调试</div></td></tr></tbody></table>

</div><div class="qwen-markdown-table-thead-tool invisible group-hover:visible"></div></div>#### 4、Thread代码案例

##### 显式创建并控制线程

```
Thread thread = new Thread(() =>
{
    Console.WriteLine("线程开始工作");
    Thread.Sleep(2000);
    Console.WriteLine("线程结束");
});
thread.IsBackground = false; // 设置为前台线程
thread.Start();
thread.Join(); // 主线程等待子线程结束
Console.WriteLine("主线程继续");


 注意：Join() 会阻塞主线程，直到该线程完成。 
```

##### 使用参数传递数据给线程

```
Thread thread = new Thread(obj =>
{
    string message = obj as string;
    Console.WriteLine($"收到消息: {message}");
});
thread.Start("Hello from thread");
```

##### 线程优先级设置（谨慎使用）

```
Thread thread = new Thread(() =>
{
    Console.WriteLine($"线程优先级: {Thread.CurrentThread.Priority}");
});
thread.Priority = ThreadPriority.Highest;
thread.Start();

高优先级线程可能影响系统性能，慎用。 
```

##### 线程异常处理（非常重要）

```
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
    Console.WriteLine("未处理异常：" + (args.ExceptionObject as Exception)?.Message);
};

Thread thread = new Thread(() =>
{
    throw new InvalidOperationException("测试异常");
});
thread.Start();

// 线程中抛出的异常不会自动传播到主线程！ 
```

##### 线程同步与锁结合使用（lock + Thread）

```
private static readonly object _sync = new object();
private static int _counter = 0;

Thread t1 = new Thread(() =>
{
    for (int i = 0; i < 1000; i++)
    {
        lock (_sync)
        {
            _counter++;
        }
    }
});

Thread t2 = new Thread(() =>
{
    for (int i = 0; i < 1000; i++)
    {
        lock (_sync)
        {
            _counter--;
        }
    }
});

t1.Start();
t2.Start();

t1.Join();
t2.Join();

Console.WriteLine(_counter); // 应该输出 0
```

##### 使用 ParameterizedThreadStart 传参（带对象）

```
class Person
{
    public string Name { get; set; }
}

Thread thread = new Thread((obj) =>
{
    var person = obj as Person;
    Console.WriteLine($"你好，{person.Name}");
});
thread.Start(new Person { Name = "张三" });
```

##### 使用 `Thread.Join(TimeSpan)` 实现超时等待

```
Thread thread = new Thread(() =>
{
    Thread.Sleep(3000);
    Console.WriteLine("线程完成");
});

thread.Start();
bool finished = thread.Join(TimeSpan.FromSeconds(2));

if (!finished)
{
    Console.WriteLine("线程仍在运行，超时");
}
```

##### 使用 `AutoResetEvent` 或 `ManualResetEvent` 实现线程通信

```
AutoResetEvent waitHandle = new AutoResetEvent(false);

Thread worker = new Thread(() =>
{
    Console.WriteLine("等待信号...");
    waitHandle.WaitOne();
    Console.WriteLine("收到信号，开始工作");
});

worker.Start();

Thread.Sleep(2000);
waitHandle.Set(); // 发送信号


var signal = new ManualResetEvent(false);

Thread worker = new Thread(() =>
{
    Console.WriteLine("工作线程开始");
    Thread.Sleep(2000);
    Console.WriteLine("工作线程完成");
    signal.Set(); // 发送信号
});

worker.Start();
Console.WriteLine("主线程等待...");
signal.WaitOne(); // 等待信号
Console.WriteLine("主线程继续");
```

##### 使用 `Thread.Abort()` 和 `Thread.Interrupt()`（不推荐）

```
Thread thread = new Thread(() =>
{
    try
    {
        Console.WriteLine("线程开始");
        Thread.Sleep(Timeout.Infinite); // 模拟长时间任务
    }
    catch (ThreadInterruptedException)
    {
        Console.WriteLine("线程被中断");
    }
    catch (ThreadAbortException)
    {
        Console.WriteLine("线程被终止");
        Thread.ResetAbort(); // 可选：取消终止
    }
});

thread.Start();
thread.Interrupt(); // 中断 Sleep/Wait 状态
// thread.Abort(); // 强制终止（不推荐）
```

##### 线程本地存储（TLS）——ThreadStatic / AsyncLocal

```
//使用 [ThreadStatic] 存储线程私有变量
[ThreadStatic]
private static int _threadId;

Thread t1 = new Thread(() => 
{
    _threadId = 1;
    Console.WriteLine($"线程 1 ID: {_threadId}");
});

Thread t2 = new Thread(() => 
{
    _threadId = 2;
    Console.WriteLine($"线程 2 ID: {_threadId}");
});

t1.Start();
t2.Start();


//使用 AsyncLocal<T> 支持异步上下文隔离（推荐用于 async/await）
AsyncLocal<int> asyncLocal = new AsyncLocal<int>();

asyncLocal.Value = 1;
Console.WriteLine($"主线程值: {asyncLocal.Value}");

Task.Run(() =>
{
    asyncLocal.Value = 2;
    Console.WriteLine($"任务线程值: {asyncLocal.Value}");
}).Wait();
```

#### 5、线程池（`ThreadPool`）

#### 提交工作项

```
ThreadPool.QueueUserWorkItem(state =>
{
    Console.WriteLine("来自线程池的工作");
});
```

##### 获取当前线程池状态

```
int workerThreads, completionPortThreads;
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
Console.WriteLine($"可用线程池线程数：{workerThreads}");
```

##### 自定义线程池大小（谨慎使用）

```
ThreadPool.SetMinThreads(10, 10); // 设置最小线程数
ThreadPool.SetMaxThreads(100, 100); // 设置最大线程数
```

#### 6、Task（基于线程池的高级封装）

##### 使用 `CancellationToken` 控制取消

```
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(2));

try
{
    await Task.Run(async () =>
    {
        while (!cts.Token.IsCancellationRequested)
        {
            await Task.Delay(500);
            Console.WriteLine("正在运行");
        }
    }, cts.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("任务被取消");
}
```

##### 使用 `ContinueWith()` 实现任务链

```
Task<int> task1 = Task.Run(() => 100);
task1.ContinueWith(prev => Console.WriteLine($"结果: {prev.Result}"));
```

##### 使用 `ValueTask` 减少分配（适用于高性能场景）

```
public ValueTask<int> ComputeAsync(int a, int b, CancellationToken ct = default)
{
    if (ct.IsCancellationRequested)
        return new ValueTask<int>(Task.FromCanceled<int>(ct));

    return new ValueTask<int>(a + b);
}
```

##### 使用 `ConfigureAwait(false)` 避免上下文捕获

```
await SomeAsyncMethod().ConfigureAwait(false);


在库方法中推荐使用，避免在 UI 线程中死锁。 
```

##### 使用 `TaskCompletionSource<T>` 封装异步逻辑

```
public Task<int> DelayedResultAsync()
{
    var tcs = new TaskCompletionSource<int>();
    new Thread(() =>
    {
        Thread.Sleep(1000);
        tcs.SetResult(42);
    }).Start();
    return tcs.Task;
}
```