NSThread使用總結

2021-07-26 19:10:48 字數 4399 閱讀 4079

一、建立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 ...