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} 工作完成");
    }
}

知识点总结

  1. 线程状态类型: .NET线程具有多种状态,通过ThreadState枚举表示
  2. 状态转换: 线程状态会随着执行过程自动转换,了解转换规律有助于调试
  3. IsAlive属性: 提供简单的方式检查线程是否仍在执行
  4. 状态监控: 在多线程应用中,监控线程状态有助于诊断性能问题和死锁
  5. 调试价值: 线程状态信息是调试并发应用程序的重要工具
  6. 注意事项: 线程状态可能快速变化,在检查状态时要考虑并发访问的影响
posted @ 2025-08-27 01:24  jessqiu  阅读(31)  评论(0)    收藏  举报