Skip to content

控制并查看线程的状态

🏷️ C# 学习

.NET 提供了 System.Threading.Thread 类型封装了线程的操作,通过该类型,可以手动的创建、查询、控制以及结束线程。

线程状态

  • Unstarted:线程建立但未启动

  • Running:线程运行

  • WaitSleepJoin:线程休眠

  • SuspendRequested:已申请挂起

  • Suspended:线程挂起

  • AbortRequested:已申请中止

  • Stopped:线程中止

示例代码

点击查看代码
csharp
using System;
using System.Threading;

namespace ThreadState
{
    class Program
    {
        static void Main(string args)
        {
            Console.WriteLine("开始测试线程 1");
            // 初始化一个线程
            Thread thread1 = new Thread(Work1);
            PrintState(thread1);
            // 启动线程
            Console.WriteLine("现在启动线程 1");
            thread1.Start();
            PrintState(thread1);
            // 让线程运行一段时间
            Thread.Sleep(3 * 1000);
            // 让线程挂起
            Console.WriteLine("现在挂起线程 1");
            thread1.Suspend();
            // 给线程足够的时间来挂起
            // 否则状态可能是 SuspendRequested
            Thread.Sleep(1000);
            PrintState(thread1);
            // 继续线程
            Console.WriteLine("现在继续线程 1");
            thread1.Resume();
            PrintState(thread1);
            // 停止线程
            Console.WriteLine("现在停止线程 1");
            thread1.Abort();
            // 给线程足够的时间停止
            // 否则状态可能是 AbortRequested
            Thread.Sleep(1000);
            PrintState(thread1);

            Console.WriteLine("开始测试线程 2");
            // 初始化一个线程
            Thread thread2 = new Thread(Work2);
            PrintState(thread2);
            // 查看睡眠状态
            thread2.Start();
            Thread.Sleep(2 * 1000);
            PrintState(thread2);
            // 给线程足够的时间结束
            Thread.Sleep(10 * 1000);
            PrintState(thread2);
            Console.Read();
        }

        /// <summary>
        /// 线程方法 1
        /// </summary>
        private static void Work1()
        {
            Console.WriteLine("线程 1 运行中");
            // 模拟线程运行,但不改变状态
            // 采用忙等状态
            while (true) ;
        }

        /// <summary>
        /// 保证一个线程 10 秒就结束
        /// </summary>
        private static void Work2()
        {
            Console.WriteLine("线程 2 开始睡眠");
            Thread.Sleep(10 * 1000);
            Console.WriteLine("线程 2 恢复运行");
        }

        /// <summary>
        /// 打印线程状态
        /// </summary>
        /// <param name="thread"></param>
        private static void PrintState(Thread thread)
        {
            Console.WriteLine(thread.ThreadState.ToString());
        }

    }
}

输出结果

点击查看输出结果
开始测试线程1
Unstarted
现在启动线程1
Running
线程1运行中
现在挂起线程1
Suspended
现在继续线程1
Running
现在停止线程1
Aborted
开始测试线程2
Unstarted
线程2开始睡眠
WaitSleepJoin
线程2恢复运行
Stopped