在任何时间点,C#中的线程都处于以下任一状态。线程在任何时刻都仅处于所示状态之一:
- 未开始
- 可运行的
- 跑步
- 无法运行
- 死的
流程图:
线程的生命周期
- 未开始状态:当创建Thread类的实例,它是在未启动的状态,表示线程还未开始时,线程处于这种状态下运行。换句话说,不调用Start()方法。
Thread thr = new Thread();
在这里, thr处于未启动状态。
- 可运行状态:准备运行的线程被移至可运行状态。在这种状态下,线程可能实际上正在运行,或者准备在任何时间运行。线程调度程序负责给线程运行时间。换句话说,将调用Start()方法。
- 运行状态:正在运行的线程。换句话说,线程获取了处理器。
- 不可运行状态:不可执行的线程,因为
- Sleep()方法被调用。
- 调用Wait()方法。
- 由于I / O请求。
- Suspend()方法被调用。
- 死状态:当线程完成其任务时,线程将进入死状态,终止状态,中止状态。
在C#中实现线程状态
在C#中,要获取线程的当前状态,请使用Thread类提供的ThreadState或IsAlive属性。
Synatx:
public ThreadState ThreadState{ get; }
或者
public bool IsAlive { get; }
线程类提供了不同类型的方法来实现线程状态。
-
Sleep()
方法用于在指定的毫秒数内临时暂停线程的当前执行,以便其他线程可以有机会开始执行,或者可以获取CPU来执行。 -
Join()
方法用于使所有调用线程都等到主线程(即,加入的线程)完成其工作。 -
Abort()
方法用于中止线程。 -
Suspend()
方法来挂起线程。 -
Resume()
方法以恢复挂起的线程。 -
Start()
方法用于将线程发送到可运行状态。
例子:
// C# program to illustrate the
// states of the thread
using System;
using System.Threading;
public class MyThread {
// Non-Static method
public void thread()
{
for (int x = 0; x < 2; x++) {
Console.WriteLine("My Thread");
}
}
}
public class ThreadExample {
// Main method
public static void Main()
{
// Creating instance for
// mythread() method
MyThread obj = new MyThread();
// Creating and initializing
// threads Unstarted state
Thread thr1 = new Thread(new ThreadStart(obj.thread));
Console.WriteLine("ThreadState: {0}",
thr1.ThreadState);
// Running state
thr1.Start();
Console.WriteLine("ThreadState: {0}",
thr1.ThreadState);
// thr1 is in suspended state
thr1.Suspend();
Console.WriteLine("ThreadState: {0}",
thr1.ThreadState);
// thr1 is resume to running state
thr1.Resume();
Console.WriteLine("ThreadState: {0}",
thr1.ThreadState);
}
}
输出:
ThreadState: Unstarted
ThreadState: Running
ThreadState: SuspendRequested
ThreadState: Running
My Thread
My Thread
说明:上面的示例显示了thr1线程的不同状态。 thr1线程的这些状态是通过使用Thread类的ThreadState属性确定的。另外,我们使用Suspend()和Resume()方法来挂起线程的当前执行,并通过使用Resume方法来恢复被挂起的线程。