1.使用執行緒的情況
①.程式需要執行和兩個和多個任務
②.程式要等待某事件的發生:例如使用者輸入、檔案操作、網路操作和搜尋
③.後台程式
2.多執行緒的併發執行
如果有多個執行緒在執行,單cpu只有乙個,到底執行的哪個?
①.如果乙個執行緒連續占用cpu資源時間過長,其它的資源得不到執行,
則系統會強制的切換執行其它執行緒。(強制剝奪)
②.如果乙個執行緒沒事可做、cpu可執行其它執行緒。(主動放棄)
③.這是由作業系統的排程機制決定的,不同的作業系統排程機制不一樣。
一般無法精確的預料多執行緒的執行順序,在程式設計的時候應特別注意
3.建立並啟動執行緒
threadstart 執行緒啟動委託名=new threadstart(方法名);
thread 執行緒例項名=new thread(執行緒啟動委託名);
執行緒例項名.start();
4.終止執行緒
①.執行緒例項名.abort();用此方法的後果是不可恢復的終止執行緒。
②.執行緒例項名.interrupt();中斷後可恢復
5.休眠執行緒
①.執行緒例項名.sleep();
當執行緒sleep時,系統就立即退出執行佇列一段時間,當睡眠結束時,系統會產生乙個時鐘中斷,從而
使執行緒回到執行佇列中,從而恢復執行緒的執行。
6.掛起/恢復執行緒
①.執行緒例項名.suspend();掛起
與執行緒休眠不同,執行緒的掛起不會使執行緒立即停止執行,直到執行緒到達安全點之後它才可以將該
執行緒掛起,如果執行緒尚未啟動或已經停止,則它將不能掛起。
②.執行緒例項名.resume();恢復
將使乙個執行緒跳出掛起狀態並使該執行緒繼續執行。
乙個執行緒不能對另乙個執行緒呼叫sleep() ,但是乙個執行緒可以對另乙個執行緒呼叫suspend()。
還可以使用許多其它的方式來阻塞執行緒。例如,可以通過呼叫 thread.join 使乙個執行緒等待另乙個執行緒 (子執行緒)停止。使用monitor.wait使乙個執行緒等待訪問乙個同步物件。
7.序列化執行緒
①.執行緒例項名.jion();
例如在主線程中插入t.jion();
主線程執行到這條語句後,主線程(當前執行緒)立即進入阻塞狀態.直到t執行完後阻塞狀態才解除。
相當於把t的任務插入或串聯到主線程中,把兩條線索串聯成一條線索
8.執行緒的鎖定機制
執行緒的鎖定機制可以保證每次只有乙個執行緒可以訪問共享資源。
使用關鍵字lock
①.lock語句的語法
lock(物件引用)語句塊;
②.lock語句的功能
當物件被lock 鎖定時,訪問該執行緒的其它執行緒會進入等待的狀態。
③.物件鎖機制保證了物件訪問的完整性:只有乙個執行緒完成操作後,其它的執行緒才能進行操作。
④.一般情況下,當乙個執行緒寫某個變數,而同時可能有其它的執行緒讀或寫這個變數時,為了保持資料的一
致性應該使用鎖定機制。
⑤.執行緒的安全性
執行緒安全性就是保護的類的成員和**的安全,從而使他們不會同時被幾個執行緒中斷,使用鎖定機制。
⑥.多執行緒公用乙個物件時,就不應該使用lock關鍵字了,這裡monitor,monitor提供了使執行緒共享資源的方 案。
monitor類可以鎖定乙個物件,乙個執行緒只有得到這把鎖才可以對該物件進行操作。
如:monitor.enter(obj);
monitor.exit(obj);
⑦.臨界區和鎖
當談論多執行緒應用程式的時候,首先應該想到的就是併發性問題。儘管這對於同時執行多個任務的程式是很有用的,但通常都是危險的。為了解決這個問題,在c#中提出了臨界區和鎖的概念。在程式設計中,臨界區是一塊在任何時候只能有乙個程序進入的區域。在c#中通過語句lock來宣告臨界區。lock宣告後面的**,不管是以行還是一塊**,在同一時間最多只能有乙個程序執行。
9.執行緒的優先順序具有不可靠性,就是說不能用優先順序來控制線程的執行順序。
10.後台執行緒
①.什麼是後台執行緒?比起應用程式的主圖形使用者介面(gui)執行緒來說,這些執行緒以較低的優先權在不同的過程中
執行著。對於不能立即執行結束, 又不想一直等待的任務,後台執行緒能很好的勝任。在c#中,把執行緒物件的
isbackground屬性設為true,該執行緒即為後台執行緒。
後台執行緒跟前臺執行緒只有乙個區別,那就是後台執行緒不妨礙程式的終止。一旦乙個程序所有的前台執行緒都終止後,
clr將通過呼叫任意乙個存活中的後台程序的abort()方法來徹底終止程序。
注意:後台執行緒不能直接操作所在程序之外的資料引用。
②.怎樣與後台執行緒通訊?運用methodinvoker委派實體。
要使用methodinvoker委派,需要三個條件:
a.乙個建立委派的後台執行緒
thread thread=new thread(new threadstart(run));
thread.isbackground=true;//把thread設為後台執行緒
thread.start();
b.乙個用作後台執行緒與前台視覺化單元的介面的類級方法
public void run()
}catch(threadinterruptedexception e)
",e);
}catch(exception ex)
",ex);}}
c.乙個應用程式中可以更新的視覺化單元
public void updatelabel()
例1:使用多執行緒實現的打字練習(vs2005)
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.text;
using system.windows.forms;
using system.threading;
/** 編寫乙個基於windows窗體的應用程式,實現打字練習功能,要使用多執行緒,在主線程裡用
* timer控制項定時產生label控制項,每個label控制項顯示乙個隨機產生的字母,每產生乙個label
* 就新開乙個執行緒(輔助線程),這個執行緒用於控制label控制項的向下移動,主線程監視鍵盤
* 輸入,如果鍵盤輸入文字與這個label控制項的text相同,label就消失
*/namespace typewriteexcercise
private void frmtyped_load(object sender, eventargs e)
private void timer1_tick(object sender, eventargs e)
private void frmtyped_keypress(object sender, keypresseventargs e)
if(label.text[0]==e.keychar)
//label.text返回的是字串,label.text[0]返回第乙個字元。e.keychar返回的是字元。這樣都為字元才能判斷}}
}public class letter
}public void run()
_label.top += 1;//有標籤,上邊距就加1畫素;
thread.sleep(_speed * 5);//讓執行緒休眠(速度越快,休眠的時間越短。以毫秒為單位);
}if(thread.currentthread.isalive)//如果當前執行緒還是存活的
}catch (exception ex)
finally //釋放資源,不管是否發生異常,finally都要五條件的執行
_container.controls.remove(_label);//移除在窗體中產生的所有標籤}}
}}
多執行緒中lock的應用
看了很多關於c 中lock使用的說明,但是感覺都沒有說到點上。最近做了乙個應用,吃了一些苦頭才把lock搞明白,關於lock的定義我就不多說了,這次主要說說lock在多執行緒中的應用及實際應用過程中遇到的問題。多個執行緒訪問同乙個變數的時候就會用到lock,但是如何應用lock呢,lock物件需要o...
MFC中多執行緒的應用
做專案中涉及到多執行緒的操作,所以學習了一下mfc中多執行緒的用法!包括控制代碼的定義 初始化,執行緒函式的定義 初始化,鎖的使用。控制代碼的定義 cwinthread thread1 執行緒函式的定義 static uint thread1 func lpvoid lpparam 加static表...
多執行緒中lock的應用
看了很多關於c 中lock使用的說明,但是感覺都沒有說到點上。最近做了乙個應用,吃了一些苦頭才把lock搞明白,關於lock的定義我就不多說了,這次主要說說lock在多執行緒中的應用及實際應用過程中遇到的問題。多個執行緒訪問同乙個變數的時候就會用到lock,但是如何應用lock呢,lock物件需要o...