控制并查看线程的状态
.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