整理 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類 也能實現執行緒同步。沒有去用,沒具體去看。