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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NSThread使用总结

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

總結(jié)

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

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