[C#][.NET] Thread 類別

Thread 類別

Thread 類別

.NET 提供一個用來控制執行緒的類別:System.Threading.Thread類別。該類別產生的Thread於OS-level的Thread,擁有自己的堆疊及內容。 Thread類別允許控制執行緒的狀態Abort() 或Suspend() 或Resume() ...等等。  Thread 類別因為是產生OS-level的Thread,所以是相當花成本,每一條建立的執行緒,都要消耗一定量的堆疊記憶體空間,以及CPU轉換(context-switch)執行緒上的消耗。

執行緒狀態說明:

  • Unstarted : 執行緒建立,但未啟動
  • Running : 執行緒已啟動
  • WaitSleepJoin : 執行緒因為呼叫Wait、Sleep或Join而休眠
  • SuspendRequested : 執行緒要求暫止中
  • Suspended : 執行緒已經暫止(可使用Resume恢復執行)
  • AbortRequested : 執行緒要求中止
  • Stopped : 執行緒中止

程式Demo:

1.執行緒建立 > 執行啟動 > 執行緒要求暫止中 > 執行緒已暫止 > 執行緒恢復啟動 > 執行緒中止

public class ThreadDemo
{
    public void Run()
    {            
        Thread t = new Thread(Work);
        Console.WriteLine("執行緒狀態:{0}", t.ThreadState);
        t.Start();
        Console.WriteLine("執行緒狀態:{0}", t.ThreadState);
        Thread.Sleep(100);
        t.Suspend();
        Console.WriteLine("執行緒狀態:{0}", t.ThreadState);
        Thread.Sleep(1000);
        Console.WriteLine("執行緒狀態:{0}", t.ThreadState);
        t.Resume();
        Console.WriteLine("執行緒狀態:{0}", t.ThreadState);
        t.Abort();
        Console.WriteLine("執行緒狀態:{0}", t.ThreadState);
        Thread.Sleep(1000);
        Console.WriteLine("執行緒狀態:{0}", t.ThreadState);
    }

    private void Work() 
    {            
        while (true) 
        {
            for (int i = 0; i < 100000000; i++)
            {

            }
        };
    }
}
執行結果

備註:程式中的 t.Suspend() 和t.Resume() 方法已過時,不建議使用,在這邊以Demo流程為主。

 

2.執行緒建立 > 執行啟動 > 執行緒休眠 > 執行緒中止

public class ThreadDemo
{
    public void Run()
    {            
        Thread t2 = new Thread(Work2);
        Console.WriteLine("執行緒狀態:{0}", t2.ThreadState);
        t2.Start();
        Thread.Sleep(1000);
        Console.WriteLine("執行緒狀態:{0}", t2.ThreadState);
        Thread.Sleep(3000); //讓休眠結束
        Console.WriteLine("執行緒狀態:{0}", t2.ThreadState);
    }

    private void Work2() 
    {
        Console.WriteLine("執行緒:{0}, 開始休眠", Thread.CurrentThread.ManagedThreadId);
        
        Thread.Sleep(3000);
        
        Console.WriteLine("執行緒:{0}, 休眠結束", Thread.CurrentThread.ManagedThreadId);
    }
}

執行結果:

小結:

Thread類別封裝了執行緒的操作,程式師可以簡單手動建立、控制以及結束執行緒,不過參考文中指出,中止或暫止Thread是一個不建議的idea。  程式的Demo只是希望了解,Thread類別能做到的事情。

 

參考:

http://blog.slaks.net/2013-10-11/threads-vs-tasks/

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。