1. 程式人生 > >【.NET執行緒--開篇】--執行緒從零開始

【.NET執行緒--開篇】--執行緒從零開始



引言

馬上就過年了,在此先提前祝福朋友們春節快樂,馬年大吉。話轉回來前幾篇部落格一直都是在說GDI+的內容,其實對於GDI+內容並不困難,但當繪製圖形時需要我們計算獲得座標點,另外如果繪製的圖形比較複雜這時候最好不要採用計算座標點的方法,這時候簡單的方法就是使用圖形閉合,Graphicspath的圖形閉合ClosedFigure方法來繪製圖形這樣會比計算座標點來的簡單。有關GDI+的內容沒有什麼新的成果類似的文章可能不會再更新,如果有什麼問題的話可以留言討論。

    今天我們來看看執行緒的文章,相信大家對執行緒並不陌生,當提到執行緒時條件反射的會先想到一條線執行的程式,這樣解釋是否正確呢?我們姑且不討論這個問題,要想知道這個答案去教材書上檢視吧。這裡需要思考一個問題,對於程式設計師來說執行緒並不陌生,但是你能區分程序和執行緒嗎?

一、程式、程序、執行緒

 1、執行緒--程式執行流的最小單元

執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行。由於執行緒之間的相互制約,致使執行緒在執行中呈現出間斷性。執行緒也有就緒、阻塞和執行三種基本狀態。每一個程式都至少有一個執行緒,若程式只有一個執行緒,那就是程式本身

   在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。

執行緒執行三態圖

 2、程序--作業系統結構基礎

    程序可以看做一次程式的執行;是一個程式及其資料在處理機上順序執行時所發生的活動;是程式在一個數據集合上執行的過程,它是系統進行資源分配和排程的一個獨立單位。

    在電腦科學中,“執行緒”和“程序”是兩個相關的概念。 二者都表示必須按特定順序執行的指令序列。 但是不同執行緒或程序中的指令可以並行執行。程序存在於作業系統內,並對應於使用者可看作為程式或應用程式的事物。 另外,執行緒存在於程序內。 因此,執行緒有時也稱作“輕量程序”。 每個程序都由一個或多個執行緒組成。

       多個程序的存在使得計算機能夠一次執行多個任務。 而多個執行緒的存在使得程序能夠分解工作以便並行執行。 在多處理器計算機上,程序或執行緒可以在不同的處理器中執行。這使得真正的並行處理成為可能。

    簡單的說一個程式至少有一個程序,一個程序至少有一個執行緒。

二、.NET執行緒


    .NET 提供了許多有助於建立和管理多執行緒應用程式的物件。其中最主要的是Thread類、ThreadPool類、和BackgroundWorker類,其中託管執行緒由 Thread 類表示, ThreadPool 類提供了建立和管理多執行緒後臺任務的簡便方法, BackgroundWorker 類為與使用者介面互動的任務提供相同的功能, Timer 類按固定的時間間隔執行後臺任務。

    在建立作業系統程序時,作業系統將插入一個執行緒以執行該程序(包括任何原始應用程式域)中的程式碼。 從此刻起,就可以建立和銷燬應用程式域,而不必建立或銷燬任何作業系統執行緒。 如果正在執行的程式碼是託管程式碼,則可以通過檢索型別為 Thread 的靜態 CurrentThread 屬性來獲取正在當前應用程式域中執行的執行緒的 Thread 物件。

 1、建立執行緒

    建立新的 Thread 物件時,將建立新的託管執行緒。 Thread 類具有接受一個 ThreadStart 委託或 ParameterizedThreadStart 委託的建構函式:該委託包裝呼叫 Start 方法時由新執行緒呼叫的方法。 多次呼叫 Start 將引發 ThreadStateException。
    Start 方法立即返回,經常是在實際啟動新執行緒之前。 可以使用 ThreadState 和 IsAlive 屬性確定任何時刻的執行緒狀態,但是絕不應該將這些屬性用於同步執行緒活動。


    Note:執行緒一旦啟動,就不必保留對 Thread 物件的引用。 該執行緒會繼續執行,直到執行緒過程結束為止。

    下面的程式碼示例建立兩個新執行緒以呼叫另一個物件上的例項和靜態方法。

using System;
using System.Threading;

///<summary>
///執行緒執行類,封裝了執行緒開始時執行的方法
///</summary>
public class ServerClass
{
    ///<summary>
    ///執行緒開始時執行此方法
    ///</summary>
    public void InstanceMethod()
    {
        Console.WriteLine("ServerClass.InstanceMethod is running on another thread.");

        // 執行緒延遲3000秒,使執行緒的執行更加明顯
         Thread.Sleep(3000);
        Console.WriteLine("The instance method called by the worker thread has ended.");
    }

    ///<summary>
    ///執行緒開始時執行此方法
    ///</summary>
    public static void StaticMethod()
    {
        Console.WriteLine("ServerClass.StaticMethod is running on another thread.");
        //執行緒延遲5000秒
         Thread.Sleep(5000);
        Console.WriteLine("The static method called by the worker thread has ended.");
    }
}

///<summary>
///執行緒建立類,封裝了執行緒建立及執行方法
///</summary>
public class Simple
{
    public static void Main()
    {
        Console.WriteLine("Thread Simple Sample");
        ServerClass serverObject = new ServerClass();

        //建立執行緒物件,並傳入serverObject.InstanceMethod方法
        Thread InstanceCaller = new Thread(new ThreadStart(serverObject.InstanceMethod));
        //開始執行執行緒
        InstanceCaller.Start();

        Console.WriteLine("The Main() thread calls this after "+ "starting the new InstanceCaller thread.");

        //建立執行緒物件,並傳入serverObject.InstanceMethod方法
        Thread StaticCaller = new Thread(new ThreadStart(ServerClass.StaticMethod));
        //開始執行緒
        StaticCaller.Start();

       Console.WriteLine("The Main() thread calls this after "+ "starting the new StaticCaller thread.");
    }
}

       上面的示例演示了執行緒的建立過程,在建立過程時為執行緒物件指定執行時的委託方法,最後使用Start方法來執行執行緒,另外還有一個重要的方法Sleep它能夠控制執行緒的延遲時間,為執行緒指定執行時停頓的時間。

結語

       最後來總結下,文章的第一篇著重介紹了執行緒、程序、程式,並通過對比來區分了三者之間的關係,另外還介紹了.NET執行緒的建立過程,主要是Thread物件方法的應用,很重要。但是有沒有想過,在執行執行緒時為什麼使用委託,另外在執行一個執行緒時是不允許使用執行緒外建立的物件的,也就是一個執行緒中呼叫的物件只能是在本執行緒內建立的,如果我們想要呼叫執行緒外的物件或者其它執行緒中的物件怎麼辦?彆著急,下篇部落格將會著重討論。

      最後給大家拜個早年,恭祝馬年大吉!