13、线程的状态
线程的状态
知识点概述
在.NET中,线程在其生命周期内会经历多种状态。了解这些状态对于线程调试和管理至关重要。线程状态由ThreadState枚举定义,包括:
- Unstarted: 线程已创建但尚未启动
- Running: 线程正在执行
- WaitSleepJoin: 线程被阻塞(等待、睡眠或连接其他线程)
- Stopped: 线程已完成执行
- Suspended: 线程已暂停
- SuspendRequested: 请求暂停线程
- StopRequested: 请求停止线程
代码案例
案例1:监控线程状态变化
using System;
using System.Threading;
class ThreadStateDemo
{
static void Main()
{
Thread thread = new Thread(DoWork);
Console.WriteLine($"初始状态: {thread.ThreadState}");
thread.Start();
Console.WriteLine($"启动后状态: {thread.ThreadState}");
Thread.Sleep(100); // 让主线程稍等
Console.WriteLine($"运行中状态: {thread.ThreadState}");
thread.Join(); // 等待线程完成
Console.WriteLine($"完成后状态: {thread.ThreadState}");
}
static void DoWork()
{
Console.WriteLine($"工作线程状态: {Thread.CurrentThread.ThreadState}");
Thread.Sleep(500); // 模拟工作
Console.WriteLine("工作完成");
}
}
案例2:检查线程是否存活
using System;
using System.Threading;
class ThreadAliveDemo
{
static void Main()
{
Thread thread = new Thread(LongRunningTask);
Console.WriteLine($"线程存活状态: {thread.IsAlive}");
thread.Start();
Console.WriteLine($"启动后存活状态: {thread.IsAlive}");
// 检查线程状态
while (thread.IsAlive)
{
Console.WriteLine($"线程仍在运行... 状态: {thread.ThreadState}");
Thread.Sleep(1000);
}
Console.WriteLine($"线程已结束,最终状态: {thread.ThreadState}");
}
static void LongRunningTask()
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"任务执行中... {i + 1}/3");
Thread.Sleep(1500);
}
}
}
案例3:多线程状态监控
using System;
using System.Threading;
using System.Collections.Generic;
class MultiThreadStateMonitor
{
static void Main()
{
List<Thread> threads = new List<Thread>();
// 创建多个线程
for (int i = 0; i < 3; i++)
{
int threadId = i;
Thread thread = new Thread(() => WorkerTask(threadId));
thread.Name = $"Worker-{threadId}";
threads.Add(thread);
}
// 启动所有线程
foreach (var thread in threads)
{
thread.Start();
}
// 监控线程状态
bool allCompleted = false;
while (!allCompleted)
{
Console.Clear();
Console.WriteLine("线程状态监控:");
Console.WriteLine("================");
allCompleted = true;
foreach (var thread in threads)
{
Console.WriteLine($"{thread.Name}: {thread.ThreadState} (存活: {thread.IsAlive})");
if (thread.IsAlive) allCompleted = false;
}
Thread.Sleep(500);
}
Console.WriteLine("\n所有线程已完成!");
}
static void WorkerTask(int id)
{
Random rand = new Random(id);
int workTime = rand.Next(2000, 5000);
Console.WriteLine($"线程 {id} 开始工作,预计耗时 {workTime}ms");
Thread.Sleep(workTime);
Console.WriteLine($"线程 {id} 工作完成");
}
}
知识点总结
- 线程状态类型: .NET线程具有多种状态,通过
ThreadState枚举表示 - 状态转换: 线程状态会随着执行过程自动转换,了解转换规律有助于调试
- IsAlive属性: 提供简单的方式检查线程是否仍在执行
- 状态监控: 在多线程应用中,监控线程状态有助于诊断性能问题和死锁
- 调试价值: 线程状态信息是调试并发应用程序的重要工具
- 注意事项: 线程状态可能快速变化,在检查状态时要考虑并发访问的影响

浙公网安备 33010602011771号