📜  C#中的线程的生命周期和状态

📅  最后修改于: 2021-05-29 14:07:47             🧑  作者: Mango

在任何时间点,C#中的线程都处于以下任一状态。线程在任何时刻都仅处于所示状态之一:

  1. 未开始
  2. 可运行的
  3. 跑步
  4. 无法运行
  5. 死的

流程图:

线程的生命周期
  1. 未开始状态:当创建Thread类的实例,它是在未启动的状态,表示线程还未开始时,线程处于这种状态下运行。换句话说,不调用Start()方法。
    Thread thr = new Thread(); 

    在这里, thr处于未启动状态。

  2. 可运行状态:准备运行的线程被移至可运行状态。在这种状态下,线程可能实际上正在运行,或者准备在任何时间运行。线程调度程序负责给线程运行时间。换句话说,将调用Start()方法。
  3. 运行状态:正在运行的线程。换句话说,线程获取了处理器。
  4. 不可运行状态:不可执行的线程,因为
    • Sleep()方法被调用。
    • 调用Wait()方法。
    • 由于I / O请求。
    • Suspend()方法被调用。
  5. 死状态:当线程完成其任务时,线程将进入死状态,终止状态,中止状态。
在C#中实现线程状态

在C#中,要获取线程的当前状态,请使用Thread类提供的ThreadStateIsAlive属性。

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方法来恢复被挂起的线程。