日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NSThread使用总结

發(fā)布時間:2024/7/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NSThread使用总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、創(chuàng)建NSThread:(1)使用NSThread類方法:detachNewThreadSelector:toTarget:withObject:該方法3個參數(shù)分別指定了線程執(zhí)行的方法,目標,和傳遞的對象。但是要注意,使用這個方法時,并沒有返回任何對象供操作,所以無法管理生成的線程。該方法讓系統(tǒng)分發(fā)出一個線程,管理權歸系統(tǒng)所有。(2)使用NSObject的實例方法:performSelectorInBackground:withObject:該方法效果和第一個方法基本上一樣,目標為對象本身。(3)使用NSThread的實例方法:initWithTarget:selector:object:該方法3個參數(shù)分別指定了線程執(zhí)行的方法,目標,和傳遞的對象。初始化之后,手動調(diào)用start方法啟動線程。線程對象由自己管理。(4)子類化NSThread的方法:寫一個類繼承自NST hread類,重寫-(void)main;方法。手動調(diào)用Start方法啟動線程。
二、線程的內(nèi)存管理:在工程的主函數(shù)中,有系統(tǒng)自動創(chuàng)建的NSAutoreleasePool對象,供在主線程中運行的對象使用。在創(chuàng)建其它的線程時,NSAutoreleasePool對象需要自己來創(chuàng)建、管理。不使用NSAutoreleasePool的后果是,系統(tǒng)中自動釋放的對象無法被最終釋放,像滾雪球一樣越滾越大,最終導致系統(tǒng)崩潰。
三、線程相關屬性方法:(1)設置線程名稱:setName。(2)配置線程的堆棧大小:setStackSize,需要在啟動線程前調(diào)用。(3)配置線程字典:threadDictionary,我們可以在返回的字典中添加需要保存的鍵值對,在該線程執(zhí)行期間都有效。(4)設置線程的優(yōu)先級:setThreadPriority,值從0到1。代表最低到最高。(5)當前線程狀態(tài):isExecutingisFinishedisCancelledisMainThread(6)線程環(huán)境狀態(tài)isMultiThreadedcurrentThread(7)線程等待以及退出sleepUntilDate:sleepForTimeInterval:exitcancel
四、線程間的通訊:線程間的通訊使用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)取消發(fā)送給當前線程的某個消息cancelPreviousPerformRequestsWithTarget:cancelPreviousPerformRequestsWithTarget:selector:object:
五、互斥鎖:NSLock類(1)NSLock的對象可以解決多線程中互斥操作的問題,它有兩個內(nèi)部狀態(tài),鎖定(locked)和打開(unlocked)。用于解決多個窗口同時買票的情景。(2)一般使用方法,在互斥代碼前后分別加上lock方法和unlock方法。可以為每段互斥代碼分別創(chuàng)建一個NSLock對象。(2)lock方法:申請鎖,如果鎖為打開狀態(tài),將鎖置為鎖定狀態(tài),然后執(zhí)行互斥代碼。如果鎖為鎖定狀態(tài),則線程阻塞,直到申請到鎖。(3)unlock方法:互斥操作完成時,釋放鎖,將鎖置為打開狀態(tài)。(4)tryLock方法:該方法返回Bool值,如果成功申請到鎖,則返回YES,如果沒有申請到鎖,則返回NO,但是線程不阻塞。具體操作由程序員根據(jù)返回狀態(tài)自己處理。(5)lockBeforeDate方法:該方法和tryLock方法類似,返回值也為Bool值。和tryLock不同的是,多了一個時間限制。如果在規(guī)定時間內(nèi)申請到鎖,則返回YES,如果沒有申請到鎖,返回NO。(6)互斥鎖不支持遞歸,因為第一次申請到鎖,在鎖釋放之前,是不可能再次申請到鎖的,線程會鎖死。比如如下代碼:-(void)test(int m){ if(m <= 0){ retun; }else{ [theLock lock]; m--; [self test:m]; [theLock unlock]; }}
六、遞歸鎖:NSRecursiveLock類(1)遞歸鎖的實例方法和NSLock一樣。(2)NSRecursiveLock支持遞歸,只要是在一個線程里,鎖可以多次被申請,而不會造成死鎖。它會記錄lock和unlock的次數(shù),然后進行匹配,當兩個方法的調(diào)用次數(shù)相等時,也就是遞歸執(zhí)行完畢時,鎖就會被釋放。
七、條件鎖:NSConditionLock類(1)NSConditionLock類有NSLock類的所有方法,可以用來做互斥操作。增加的其它方法為條件鎖方法。(2)條件鎖用來解決生產(chǎn)者-消費者這樣情景的問題。(3)NSConditionLock初始化方法:initWithCondition:,通過一個條件變量初始化。? ? 假設我們定義兩個狀態(tài),有票:HAS_PRODUCT,沒票:NO_PRODUCT。初始化時為無票。(4)生產(chǎn)者申請鎖:lock,不用有條件,因為生產(chǎn)者生產(chǎn)不需要依賴消費者。(5)生產(chǎn)者生產(chǎn)完畢之后:使用unlockWithCondition:HAS_PRODUCT方法,釋放鎖,并且改變狀態(tài)為有票。(6)消費者申請鎖:lockWhenCondition:HAS_PRODUCT,申請鎖,并且在有票的情況下才能獲取到鎖,否則線程會阻塞。(7)消費者消費完畢之后:unlockWithCondition:empty?NO_PRODUCT:HAS_PRODUCT。釋放鎖,如果當前產(chǎn)品消費完了,則將狀態(tài)修改為沒票,否則修改為有票。
八、@synchronized使用(1)該指令可以完成互斥鎖能完成的任務,能夠將objective-c中的對象當做一種互斥體來使用。(2)使用示例:id object = [[NSObject alloc] init];@synchronized(object){ //在內(nèi)部添加互斥操作}(3)示例中的object對象相當于一個NSLock對象,它在@synchronized(object)開始的時候被請求,在結束的時候被釋放。
九、信號量:NSCondition(1)NSCodition是一種特殊類型的鎖,我們可以用它來同步線程執(zhí)行的順序。它分為信號態(tài)和非信號態(tài)。當NSCondition為等待狀態(tài)時,為非信號態(tài),反之為信號態(tài)。一個處于等待狀態(tài)的線程,需要等待其它線程給他發(fā)送信號,才能喚醒。(2)等待線程的使用過程:鎖住NSCondition對象;連續(xù)檢查條件屬性;若不滿足條件,線程進入等待狀態(tài)(鎖自動被打開);直到滿足條件,執(zhí)行任務;解除NSCondition鎖定(3)另外一個線程喚醒線程的過程:鎖住NSCondition對象;改變條件屬性的值;喚醒等待線程(如果只有一個線程在等待,使用signal,當有多個線程在等待,使用broadcast);解除NSCondition鎖定。(4)示例代碼:NSCondition *theCondition = [[NSCondition alloc] init];BOOL readyToGo = NO;----------------------------------------//線程1代碼[theCondition lock];//請求鎖while (readyToGo == NO){? ? [theCondition wait];//線程等待,鎖自動打開}//在此執(zhí)行任何代碼[theCondition unlock];//釋放鎖----------------------------------------//線程2代碼:[theCondition lock];//請求鎖readyToGo = YES;//重置條件屬性[theCondition signal];//將NSCondition置為信號態(tài),將喚醒線程1[theCondition unlock];//釋放鎖
十、死鎖:兩個或者兩個以上的進程或者線程在執(zhí)行過程中,因爭奪資源而造成一種互相等待的情況。比如:進程P1、P2,資源R1、R2;P1占用R1,P2占用R2;但此時P1想占用R2,又不想釋放R1,P2想占用R1,但是又不釋放R2,造成互相等待,從而造成死鎖。

總結

以上是生活随笔為你收集整理的NSThread使用总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。