一、建立nsthread:(1)使用nsthread類方法:detachnewthreadselector:totarget:withobject:
該方法3個引數分別指定了執行緒執行的方法,目標,和傳遞的物件。但是要注意,使用這個方法時,並沒有返回任何物件供操作,所以無法管理生成的執行緒。該方法讓系統分發出乙個執行緒,管理權歸系統所有。
(2)使用nsobject的例項方法:performselectorinbackground:withobject:該方法效果和第乙個方法基本上一樣,目標為物件本身。
(3)使用nsthread的例項方法:initwithtarget:selector:object:該方法3個引數分別指定了執行緒執行的方法,目標,和傳遞的物件。初始化之後,手動呼叫start方法啟動執行緒。執行緒物件由自己管理。
(4)子類化nsthread的方法:寫乙個類繼承自nsthread類,重寫-(void)main;方法。手動呼叫start方法啟動執行緒。
二、執行緒的記憶體管理:
在工程的主函式中,有系統自動建立的nsautoreleasepool物件,供在主線程中執行的物件使用。在建立其它的執行緒時,nsautoreleasepool物件需要自己來建立、管理。不使用nsautoreleasepool的後果是,系統中自動釋放的物件無法被最終釋放,像滾雪球一樣越滾越大,最終導致系統崩潰。
(1)設定執行緒名稱:setname。
(2)配置執行緒的堆疊大小:setstacksize,需要在啟動執行緒前呼叫。
(3)配置執行緒字典:threaddictionary,我們可以在返回的字典中新增需要儲存的鍵值對,在該執行緒執行期間都有效。
(4)設定執行緒的優先順序:setthreadpriority,值從0到1。代表最低到最高。
(5)當前執行緒狀態:
i***ecuting
isfinished
iscancelled
ismainthread
(6)執行緒環境狀態
ismultithreaded
currentthread
(7)執行緒等待以及退出
sleepuntildate:
sleepfortimeinterval:
exit
cancel
四、執行緒間的通訊:執行緒間的通訊使用performselector系列方法:
(1)在應用程式主線程中做事情:
performselectoronmainthread:withobject:waituntildone:
performselectoronmainthread:withobject:waituntildone:modes:
(2)在指定執行緒中做事情:
performselector:onthread:withobject:waituntildone:
performselector:onthread:withobject:waituntildone:modes:
(3)在當前執行緒中做事情:
performselector:withobject:afterdelay:
performselector:withobject:afterdelay:inmodes:
(4)取消傳送給當前執行緒的某個訊息
cancelpreviousperformrequestswithtarget:
cancelpreviousperformrequestswithtarget:selector:object:
五、互斥鎖:nslock類
(1)nslock的物件可以解決多執行緒中互斥操作的問題,它有兩個內部狀態,鎖定(locked)和開啟(unlocked)。用於解決多個視窗同時買票的情景。
(2)一般使用方法,在互斥**前後分別加上lock方法和unlock方法。可以為每段互斥**分別建立乙個nslock物件。
(2)lock方法:申請鎖,如果鎖為開啟狀態,將鎖置為鎖定狀態,然後執行互斥**。如果鎖為鎖定狀態,則執行緒阻塞,直到申請到鎖。
(3)unlock方法:互斥操作完成時,釋放鎖,將鎖置為開啟狀態。
(4)trylock方法:該方法返回bool值,如果成功申請到鎖,則返回yes,如果沒有申請到鎖,則返回no,但是執行緒不阻塞。具體操作由程式設計師根據返回狀態自己處理。
(5)lockbeforedate方法:該方法和trylock方法類似,返回值也為bool值。和trylock不同的是,多了乙個時間限制。如果在規定時間內申請到鎖,則返回yes,如果沒有申請到鎖,返回no。
(6)互斥鎖不支援遞迴,因為第一次申請到鎖,在鎖釋放之前,是不可能再次申請到鎖的,執行緒會鎖死。
比如如下**:
-(void)test(int m)else }
六、遞迴鎖:nsrecursivelock類
(1)遞迴鎖的例項方法和nslock一樣。
(2)nsrecursivelock支援遞迴,只要是在乙個執行緒裡,鎖可以多次被申請,而不會造成死鎖。它會記錄lock和unlock的次數,然後進行匹配,當兩個方法的呼叫次數相等時,也就是遞迴執行完畢時,鎖就會被釋放。
七、條件鎖:nsconditionlock類
(1)nsconditionlock類有nslock類的所有方法,可以用來做互斥操作。增加的其它方法為條件鎖方法。
(2)條件鎖用來解決生產者-消費者這樣情景的問題。
(3)nsconditionlock初始化方法:initwithcondition:,通過乙個條件變數初始化。
假設我們定義兩個狀態,有票:has_product,沒票:no_product。初始化時為無票。
(4)生產者申請鎖:lock,不用有條件,因為生產者生產不需要依賴消費者。
(5)生產者生產完畢之後:使用unlockwithcondition:has_product方法,釋放鎖,並且改變狀態為有票。
(6)消費者申請鎖:lockwhencondition:has_product,申請鎖,並且在有票的情況下才能獲取到鎖,否則執行緒會阻塞。
(7)消費者消費完畢之後:unlockwithcondition:empty?no_product:has_product。釋放鎖,如果當前產品消費完了,則將狀態修改為沒票,否則修改為有票。
八、@synchronized使用
(1)該指令可以完成互斥鎖能完成的任務,能夠將objective-c中的物件當做一種互斥體來使用。
(2)使用示例:
id object = [[nsobject alloc] init];
@synchronized(object)
(3)示例中的object物件相當於乙個nslock物件,它在@synchronized(object)開始的時候被請求,在結束的時候被釋放。
九、訊號量:nscondition
(1)nscodition是一種特殊型別的鎖,我們可以用它來同步執行緒執行的順序。它分為訊號態和非訊號態。當nscondition為等待狀態時,為非訊號態,反之為訊號態。乙個處於等待狀態的執行緒,需要等待其它執行緒給他傳送訊號,才能喚醒。
(2)等待執行緒的使用過程:
鎖住nscondition物件;
連續檢查條件屬性;
若不滿足條件,執行緒進入等待狀態(鎖自動被開啟);
直到滿足條件,執行任務;
解除nscondition鎖定
(3)另外乙個執行緒喚醒執行緒的過程:
鎖住nscondition物件;
改變條件屬性的值;
喚醒等待執行緒(如果只有乙個執行緒在等待,使用signal,當有多個執行緒在等待,使用broadcast);
解除nscondition鎖定。
(4)示例**:
nscondition *thecondition = [[nscondition alloc] init];
bool readytogo = no;
----------------------------------------
//執行緒1**
[thecondition lock];//請求鎖
while (readytogo == no)
//在此執行任何**
[thecondition unlock];//釋放鎖
----------------------------------------
//執行緒2**:
[thecondition lock];//請求鎖
readytogo = yes;//重置條件屬性
[thecondition signal];//將nscondition置為訊號態,將喚醒執行緒1
[thecondition unlock];//釋放鎖
十、死鎖:兩個或者兩個以上的程序或者執行緒在執行過程中,因爭奪資源而造成一種互相等待的情況。比如:
程序p1、p2,資源r1、r2;p1占用r1,p2占用r2;但此時p1想占用r2,又不想釋放r1,p2想占用r1,但是又不釋放r2,造成互相等待,從而造成死鎖。
使用NSThread起執行緒
nsthread是起執行緒的主角,大部分時候我們使用這個類。由於本人macbook暫時不能用,所以這裡只貼出 在viewcontroller.h中 inte ce tnsthreadviewcontroller uiviewcontroller property bool bexit ibactio...
NSThread 的建立和使用
執行緒建立與啟動 nsthread的建立主要有兩種直接方式 nsthread detachnewthreadselector selector mythreadmainmethod totarget self withobject nil 和 nsthread mythread nsthread a...
多執行緒 NSThread 的使用
nsthread簡介 使用nsthread 實現多執行緒,需要手動管理執行緒的生命週期,一.執行緒的建立 1.例項方法建立,需要手動啟動執行緒 nsthread thread nsthreadalloc initwithtarget selfselector selector run object ...