1. 程式人生 > >整理 C# 多執行緒常用的幾個物件和方法

整理 C# 多執行緒常用的幾個物件和方法

Thread 幾個中要的方法

     Sleep(int):靜態方法,暫停當前執行緒指定的毫秒數

     Abort():通常使用該方法來終止一個執行緒  ,Thread.ResetAbort() 可以恢復終止的執行緒
     Suspend():不是終止未完成的執行緒,它僅僅是掛起執行緒,還可以恢復(已過期,但還是可以用)

     Resume()://恢復被Suspend()方法掛起的執行緒的執行(已過期可以用)

Join():給建立一個子執行緒,給它加了這個方法,其它執行緒就會暫停執行,直到這個執行緒執行完為止才去執行(包括主執行緒),

下面的例子如果不加join()方法,兩個執行緒和主執行緒是並行執行的。如加上Join()方法,就會等到執行完,再執行下面的程式碼

Thread threadA = new Thread(SleepMethod);     //執行的必須是無返回值的方法 
            threadA.Name = "小A";
            //threadA.Start(); ////啟動執行緒

            Thread threadB = new Thread(SleepMethod);
            threadB.Name = "小B";

            threadA.Start(); //啟動執行緒

            //Join通俗的說就是建立一個子執行緒,給它加了這個方法,其它執行緒就會暫停執行,直到這個執行緒執行完為止才去執行(包括主執行緒)
            threadA.Join();
            threadB.Start();
            threadB.Join();
            
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("我是:主執行緒,我迴圈{1}次", Thread.CurrentThread.Name, i);
                Thread.Sleep(300);          //休眠300毫秒                                                
            }
            Console.ReadKey();

Abort() 和 ResetAbort() 方法

Abort()方法是終止執行緒,ResetAbort()取消為當前執行緒請求的Thread.Abort()。

個人理解類似於Suspend()掛起執行緒和Resume()恢復被掛起的資源。但是 Suspend()仍會鎖定被持有的鎖定,其他執行緒不能訪問被鎖定的資源,當試圖使用鎖定的資源時,就會造成死鎖。所以Suspend()既然過期了,就儘量不要使用它。

            Thread thread = new Thread(ResetAbortMethod);//必須執行無返回值的方法
            thread.Name = "子執行緒";
            thread.Start();//是執行緒被安排執行
            StringBuilder threadInfo = new StringBuilder();
            threadInfo.AppendFormat(" 執行緒當前的執行狀態:{0}", thread.IsAlive);
            threadInfo.AppendFormat("\n 執行緒的當前的名字:{0}", thread.Name);
            threadInfo.AppendFormat("\n 執行緒的當前等級:{0}", thread.Priority);
            threadInfo.AppendFormat("\n 執行緒當前的狀態:{0}", thread.ThreadState);

            Console.WriteLine(threadInfo);
            Console.ReadKey();
上面的執行緒呼叫的是下面的方法
public static void ResetAbortMethod()
        {
            try
            {
                Console.WriteLine("我是:{0},我要終止了", Thread.CurrentThread.Name);

                //終止執行緒,後面的程式碼不會執行。(執行緒終止會引發異常ThreadAbortException,Thread.ResetAbort() )
                Thread.CurrentThread.Abort();
            }
            catch (ThreadAbortException ex)
            {
                Console.WriteLine("我是:{0},我又啟動了", Thread.CurrentThread.Name);

                //取消為當前執行緒請求的 System.Threading.Thread.Abort(System.Object) ,取消後,後面的程式碼可以執行
                Thread.ResetAbort();
            }

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("我是:{0},我迴圈了{1}次", Thread.CurrentThread.Name,i);
            }
        }

執行緒安全:當一個執行緒訪問該類的某個資料時,進行資料保護,其他執行緒不能進行訪問知道該執行緒讀取完畢,                其他執行緒才可使用。不然會出現資料的不一致性。

執行緒是非同步執行的,為此,我需要執行同步執行緒。就是多個執行緒一個一個(one by one)的執行。

Lock就可以了實現了。

摘抄內容:

lock(this) 鎖定 當前例項物件,如果有多個類例項的話,lock鎖定的只是當前類例項,對其它類例項無影響。所有不推薦使用。 
lock(typeof(Model))鎖定的是model類的所有例項。 
lock(obj)鎖定的物件是全域性的私有化靜態變數。外部無法對該變數進行訪問。 
lock 確保當一個執行緒位於程式碼的臨界區時,另一個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的程式碼,則它將一直等待(即被阻止),直到該物件被釋放。 
所以,lock的結果好不好,還是關鍵看鎖的誰,如果外邊能對這個誰進行修改,lock就失去了作用。所以一般情況下,使用私有的、靜態的並且是隻讀的物件。

1、lock的是必須是引用型別的物件,string型別除外。

2、lock推薦的做法是使用靜態的、只讀的、私有的物件。

3、保證lock的物件在外部無法修改才有意義,如果lock的物件在外部改變了,對其他執行緒就會暢通無阻,失去了lock的意義。

Monitor類和Mutex類 也能實現執行緒同步。沒有去用,沒具體去看。