一姆另、基本概念
線程是用來(lái)執(zhí)行任務(wù)的喇肋,線程徹底執(zhí)行完任務(wù)A才能執(zhí)行任務(wù)B坟乾,為了同時(shí)執(zhí)行兩個(gè)任務(wù),產(chǎn)生了多線程
1蝶防、進(jìn)程
1)進(jìn)程是應(yīng)用程序的執(zhí)行實(shí)例甚侣,簡(jiǎn)單來(lái)說(shuō)就是在操作系統(tǒng)中運(yùn)行的程序,我在手機(jī)中只打開(kāi)QQ和微信兩個(gè)軟件间学,系統(tǒng)中就會(huì)有兩個(gè)進(jìn)程存在
2)進(jìn)程不能執(zhí)行任務(wù)
3)進(jìn)程在運(yùn)行時(shí)創(chuàng)建的資源隨著進(jìn)程的終止而死亡
2殷费、線程
1)進(jìn)程本身是不能執(zhí)行任務(wù)的,進(jìn)程想要執(zhí)行任務(wù)必須得有線程低葫,線程是進(jìn)程內(nèi)部獨(dú)立的執(zhí)行單元详羡,同時(shí)只能執(zhí)行一個(gè)任務(wù),相當(dāng)于一個(gè)子程序嘿悬。線程被分為兩種实柠,主線程和子線程
2)線程執(zhí)行完畢就會(huì)被銷(xiāo)毀
3)主線程:當(dāng)應(yīng)用程序啟動(dòng)時(shí)自動(dòng)創(chuàng)建和啟動(dòng),通常用來(lái)處理用戶(hù)的輸入并響應(yīng)各種事件和消息善涨。主線程的終止也意味著程序的結(jié)束
進(jìn)程一啟動(dòng)就會(huì)自動(dòng)自動(dòng)創(chuàng)建
顯示和刷新UI界面
處理UI事件
4)子線程:由主線程來(lái)創(chuàng)建窒盐,用來(lái)幫助主線程執(zhí)行程序的后臺(tái)處理任務(wù),如果子線程A中又創(chuàng)建一個(gè)子線程B钢拧,在創(chuàng)建之后登钥,這兩者就是相互獨(dú)立的,多個(gè)子線程在效果上可以同時(shí)執(zhí)行娶靡。
處理耗時(shí)的操作
子線程不能用來(lái)刷新UI
3牧牢、多線程
1)目前大多數(shù)的app,都需要連接服務(wù)器,而訪問(wèn)服務(wù)器的速度可能快也可能慢姿锭,如果一個(gè)app訪問(wèn)服務(wù)器的操作沒(méi)有在子線程操作的話(huà)塔鳍,在該app訪問(wèn)服務(wù)器的過(guò)程中,該軟件是不能相應(yīng)用戶(hù)的操作的呻此,只有該app訪問(wèn)結(jié)束以后轮纫,app才能相應(yīng)用戶(hù)的操作,這就造成了線程阻塞焚鲜,也就是我們常說(shuō)的卡頓線程
2)一條線程在同一時(shí)間內(nèi)只能執(zhí)行一個(gè)任務(wù)掌唾,但是進(jìn)程可以有多條線程,可以開(kāi)啟多條線程來(lái)執(zhí)行不同的任務(wù)忿磅,從而提高程序的執(zhí)行效率糯彬,避免線程阻塞
3)操作系統(tǒng)會(huì)根據(jù)線程的優(yōu)先級(jí)來(lái)安排CPU的時(shí)間,優(yōu)先級(jí)高的線程葱她,優(yōu)先調(diào)用的幾率會(huì)更大撩扒,同級(jí)的話(huà),看線程執(zhí)行的先后
4)同一時(shí)間內(nèi)吨些,CPU只能處理一條線程搓谆,只有一條線程在工作炒辉,多線程并行執(zhí)行,其實(shí)就是各個(gè)線程不斷切換泉手,因?yàn)榍袚Q的時(shí)間很快很快黔寇,就造成了同時(shí)執(zhí)行的假象,原理如下斩萌,比如A啡氢、B兩個(gè)線程
-? A執(zhí)行到某一時(shí)間段要切換了,可A任務(wù)沒(méi)有完成术裸,系統(tǒng)就會(huì)把A當(dāng)前執(zhí)行的位置和數(shù)據(jù)以入棧的方式保存起來(lái)
-? 然后B線程執(zhí)行,B執(zhí)行時(shí)間到了亭枷,他的位置狀態(tài)也會(huì)被系統(tǒng)保存到B的棧中
- 系統(tǒng)自動(dòng)找到A的棧袭艺,將A之前保存的數(shù)據(jù)恢復(fù),又可以從A之前斷開(kāi)的狀態(tài)繼續(xù)執(zhí)行下去叨粘,如此循環(huán)
5)系統(tǒng)每開(kāi)一個(gè)線程都有比較大的開(kāi)銷(xiāo)猾编,若線程開(kāi)的過(guò)多,不僅會(huì)占用大量的內(nèi)存和讓程序更加復(fù)雜升敲,而且會(huì)加重CPU的負(fù)擔(dān)答倡,這樣會(huì)使你的手機(jī)更容易發(fā)熱
6)多線程之間能夠?qū)崿F(xiàn)數(shù)據(jù)的共享
二、線程與進(jìn)程的關(guān)系
1驴党、線程是CPU執(zhí)行任務(wù)的基本單位瘪撇,一個(gè)進(jìn)程可以有多個(gè)線程,但同時(shí)只能執(zhí)行一個(gè)任務(wù)
2港庄、進(jìn)程就是運(yùn)行中的軟件倔既,是動(dòng)態(tài)的
3、一個(gè)操作系統(tǒng)可以對(duì)應(yīng)多個(gè)進(jìn)程鹏氧,一個(gè)進(jìn)程可以有多條線程渤涌,但至少有一個(gè)線程
4、同一個(gè)進(jìn)程內(nèi)的線程共享進(jìn)程里的資源
三把还、多線程的作用
1实蓬、提高程序執(zhí)行效率,避免線程阻塞造成的卡頓現(xiàn)象
2吊履、能適當(dāng)提高資源利用率(CPU安皱、內(nèi)存)
總結(jié):
1、進(jìn)程就是一個(gè)執(zhí)行中的應(yīng)用程序
2艇炎、線程在進(jìn)程里练俐,幫助進(jìn)程執(zhí)行任務(wù)
3、系統(tǒng)中可以有多個(gè)進(jìn)程冕臭,進(jìn)程里面可以有多個(gè)線程腺晾,必須有有一個(gè)主線程
4燕锥、子線程: 耗時(shí)的操作,網(wǎng)絡(luò)請(qǐng)求相關(guān)的
5悯蝉、主線程: 更新UI的
四归形、三種多線程編程技術(shù)
1、NSThread
NSThread是輕量級(jí)的多線程開(kāi)發(fā)鼻由,使用并不復(fù)雜暇榴,但使用NSThread需要自己管理線程的生命周期
2、NSOperation
1)使用NSOperation和NSOperationQueue進(jìn)行多線程開(kāi)發(fā)類(lèi)似于線程池蕉世,只要將一個(gè)NSOperation放到NSOperationQueue這個(gè)隊(duì)列中線程就會(huì)以此啟動(dòng)蔼紧。
2)NSOperationQueue負(fù)責(zé)管理、執(zhí)行所有的NSOperation,在這個(gè)過(guò)程中可以更加容易管理線程總數(shù)和控制線程之間的依賴(lài)關(guān)系
3)NSOperation有兩常用子類(lèi)用于創(chuàng)建線程操作:NSInvocationOperation和NSBlockOperation狠轻,兩種方式本質(zhì)沒(méi)有區(qū)別奸例,但后者使用block形式進(jìn)行代碼組織,使用相對(duì)方便向楼。
3查吊、GCD
1)CGD是基于C語(yǔ)言開(kāi)發(fā)的一套多線程開(kāi)發(fā)機(jī)制,也是目前蘋(píng)果官方推薦的多線程開(kāi)發(fā)方法
2)GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程湖蜕、調(diào)度任務(wù)逻卖、銷(xiāo)毀線程),程序員只需要告訴GCD想要執(zhí)行什么任務(wù)昭抒,不需要編寫(xiě)任何代碼管理線程
3)GCD是這三種多線程開(kāi)發(fā)方式中抽象層次最高的评也,使用起來(lái)也是最為方便的,只是基于C語(yǔ)言開(kāi)發(fā)灭返,并不像前兩種是面向?qū)ο箝_(kāi)發(fā)仇参,而是完全面向過(guò)程的
4)優(yōu)點(diǎn),他對(duì)于多核運(yùn)算更加有效婆殿,會(huì)自動(dòng)利用更多的CPU內(nèi)核
5)GCD中也有類(lèi)似于NSOperationQueue的隊(duì)列诈乒,GCD統(tǒng)一管理整個(gè)隊(duì)列中的任務(wù),GCD中的隊(duì)列分為并行隊(duì)列和串行隊(duì)列兩類(lèi)
串行隊(duì)列
只有一個(gè)線程婆芦,加入到隊(duì)列中的操作按添加順序執(zhí)行
并發(fā)隊(duì)列
有多個(gè)線程怕磨,操作進(jìn)來(lái)以后會(huì)將這些線程安排在可用的處理器上,同時(shí)保證先進(jìn)來(lái)的任務(wù)優(yōu)先處理
GCD中有個(gè)特殊的隊(duì)列就是主隊(duì)列消约,用來(lái)執(zhí)行主線程上的操作任務(wù)
/////////GCD///////
一肠鲫、基本概念
全稱(chēng)是Grand Central Dispatch,純C語(yǔ)言或粮,提供非常多強(qiáng)大的函數(shù)导饲,是目前蘋(píng)果官網(wǎng)推薦的多線程開(kāi)發(fā)方式,NSOperation便是基于GCD的封裝
二、GCD的優(yōu)勢(shì)所在
1渣锦、為多核的并行運(yùn)算提出了解決方案
2硝岗、GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核,比如雙核袋毙、四核
3型檀、GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)听盖、銷(xiāo)毀線程)
4胀溺、程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫(xiě)任何線程管理代碼
三皆看、GCD中有2個(gè)核心概念
1仓坞、隊(duì)列:用來(lái)存放任務(wù)
1)串行隊(duì)列
只有一個(gè)線程,加入到隊(duì)列中的操作按添加順序依次執(zhí)行腰吟,一個(gè)任務(wù)執(zhí)行完畢后无埃,才能再執(zhí)行下一個(gè)任務(wù)
2)并發(fā)隊(duì)列
有多個(gè)線程,操作進(jìn)來(lái)以后會(huì)將這些線程安排在可用的處理器上蝎困,同時(shí)保證先進(jìn)來(lái)的任務(wù)優(yōu)先處理
PS:GCD中還有一個(gè)特殊隊(duì)列就是主隊(duì)列,用來(lái)執(zhí)行主線程的操作任務(wù)
2倍啥、任務(wù):放在隊(duì)列中執(zhí)行
1)同步執(zhí)行
只能在當(dāng)前線程中執(zhí)行任務(wù)禾乘,不具備開(kāi)啟新線程的能力
2)異步執(zhí)行
可以在新的線程中執(zhí)行任務(wù),具備開(kāi)啟新線程的能力虽缕。
四始藕、GCD做多線程開(kāi)發(fā)可以抽象成兩步
1、找到隊(duì)列
1)找到更新UI的主線程所在的隊(duì)列
dispatch_queue_t mainQueue= dispatch_get_main_queue();
2) 創(chuàng)建隊(duì)列
dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL);
第一個(gè)參數(shù):隊(duì)列名字
第二個(gè)參數(shù):隊(duì)列類(lèi)類(lèi)型
并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT
串行隊(duì)列:DISPATCH_QUEUE_SERIAL
3)系統(tǒng)內(nèi)部給我們提供有一個(gè)現(xiàn)成的并發(fā)全局隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(0 , 0);
第一個(gè)參數(shù):線程的優(yōu)先級(jí), DISPATCH_QUEUE_PRIORITY_BACKGROUND是最低的氮趋。
第二個(gè)參數(shù):系統(tǒng)保留的參數(shù)伍派,永遠(yuǎn)傳0
2、在隊(duì)列中確定想做的事
1) 使用同步的方式
dispatch_sync(queue, ^{
});
2)使用異步的方式
dispatch_async(queue, ^{
});
五剩胁、GCD創(chuàng)建的線程任務(wù)有四種執(zhí)行方式
1诉植、串行隊(duì)列同步執(zhí)行任務(wù)
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(serialQueue, ^{
NSLog(@"-%@",[NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"1 - %@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"2 - %@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"3 - %@", [NSThread currentThread]);
});
同步不具有開(kāi)辟新線程的能力,不會(huì)開(kāi)辟新的線程去執(zhí)行任務(wù)昵观,會(huì)在當(dāng)前線程中順序執(zhí)行任務(wù)晾腔。
2、串行隊(duì)列異步執(zhí)行任務(wù)
dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue1, ^{
NSLog(@"1 = %@",[NSThread currentThread]);
});
dispatch_async(serialQueue1, ^{
NSLog(@"2 = %@",[NSThread currentThread]);
});
dispatch_async(serialQueue1, ^{
NSLog(@"3 = %@",[NSThread currentThread]);
});
異步具有創(chuàng)建新線程的能力啊犬,會(huì)開(kāi)辟新的線程去執(zhí)行任務(wù)灼擂,但由于是串行,里面只能創(chuàng)建一個(gè)線程觉至,所以還是會(huì)按順序執(zhí)行
3剔应、并行隊(duì)列同步執(zhí)行任務(wù)
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(concurrentQueue, ^{
NSLog(@"1 = %@",[NSThread currentThread]);
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"2 = %@",[NSThread currentThread]);
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"3 = %@",[NSThread currentThread]);
});
同步不具有創(chuàng)建新線程的能力,不會(huì)開(kāi)辟新的線程去執(zhí)行任務(wù),會(huì)在當(dāng)前線程去執(zhí)行任務(wù)
4峻贮、并發(fā)隊(duì)列異步執(zhí)行任務(wù)(常用)
dispatch_queue_t concurrentQueue1 = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue1, ^{
NSLog(@"1 = %@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue1, ^{
NSLog(@"2 = %@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue1, ^{
NSLog(@"3 = %@",[NSThread currentThread]);
});
并行隊(duì)列可以里可以有多個(gè)線程席怪,同步執(zhí)行的方式又可以開(kāi)辟多個(gè)線程,所以這里實(shí)現(xiàn)了多個(gè)線程并行執(zhí)行,沒(méi)有按照順序
六月洛、GCD組的應(yīng)用
GCD中可以將一組相關(guān)聯(lián)的操作何恶,定義到一個(gè)群組中
定義到群組中之后,當(dāng)所有線程完成時(shí)嚼黔,可以獲得通知
0细层、創(chuàng)建全局隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
1、定義群組
dispatch_group_t group = dispatch_group_create();
2唬涧、定義群組的異步任務(wù)
dispatch_group_async(group, queue, ^{
});
dispatch_group_async(group, queue, ^{
});
3疫赎、群組任務(wù)完成通知
dispatch_group_notify(group, queue, ^{
});
1)dispatch_group_notify可以監(jiān)聽(tīng)一組任務(wù)是否完成。這個(gè)方法很有用碎节,比如你執(zhí)行三個(gè)下載任務(wù)捧搞,當(dāng)三個(gè)任務(wù)都下載完成后,才通知界面說(shuō)已經(jīng)完成
2)如果不需要監(jiān)聽(tīng)一組任務(wù)狮荔,可以直接使用dispatch_async方法
六胎撇、線程鎖
1、在多線程應(yīng)用中殖氏,所有被搶奪資源的屬性需要設(shè)置為原子屬性,atomic屬性晚树,必須與@synchronized(同步鎖)一起使用 附加:如果將屬性設(shè)置為原子屬性,會(huì)十分消耗性能雅采,所以在多線程開(kāi)發(fā)中盡量避免資源搶奪問(wèn)題
2爵憎、系統(tǒng)會(huì)在多線程搶奪時(shí),保證該屬性有且僅有一個(gè)線程能夠訪問(wèn)
3婚瓜、操作步驟
1)將資源屬性設(shè)置原子屬性
2)將處理該屬性的代碼放到線程鎖中
@synchronized (self) {
}
////////////NSOperation//////////
一宝鼓、基本概念
1)使用NSOperation和NSOperationQueue進(jìn)行多線程開(kāi)發(fā)類(lèi)似于線程池,只要將一個(gè)NSOperation放到NSOperationQueue這個(gè)隊(duì)列中線程就會(huì)以此啟動(dòng)巴刻。
2)NSOperationQueue負(fù)責(zé)管理愚铡、執(zhí)行所有的NSOperation,在這個(gè)過(guò)程中可以更加容易管理線程總數(shù)和控制線程之間的依賴(lài)關(guān)系
二、NSOperation
1胡陪、利用他來(lái)創(chuàng)建線程操作茂附,線程操作只有放在線程隊(duì)列中才會(huì)在子線程中執(zhí)行
2、NSOperation有兩常用子類(lèi)用于創(chuàng)建線程操作:NSInvocationOperation和NSBlockOperation督弓,兩種方式本質(zhì)沒(méi)有區(qū)別营曼,但后者使用block形式進(jìn)行代碼組織,使用相對(duì)方便愚隧。
2蒂阱、設(shè)置線程依賴(lài)關(guān)系锻全,NSOperation之間可以設(shè)置依賴(lài)來(lái)保證執(zhí)行順序,A依賴(lài)于B代表著,B執(zhí)行完后录煤,才能執(zhí)行A
[A addDependency:B];
三鳄厌、NSOperationQueue
1、主隊(duì)列
凡是添加到主隊(duì)列中的任務(wù)(NSOpertaion),都會(huì)放到主線程中執(zhí)行
[NSOperationQueue mainQueue]
2妈踊、非主隊(duì)列
添加到這種隊(duì)列中的任務(wù)了嚎,都會(huì)放到子線程中執(zhí)行
[[NSOperationQueue alloc]init]
3、隊(duì)列的暫停
queue.suspended = YES;
1)只要設(shè)置隊(duì)列的suspended為YES, 那么就會(huì)暫停隊(duì)列中其它任務(wù)的執(zhí)行廊营,也就是說(shuō)不會(huì)再繼續(xù)執(zhí)行沒(méi)有執(zhí)行到得任務(wù)
2)設(shè)置為暫停之后, 不會(huì)立即暫停,會(huì)繼續(xù)執(zhí)行當(dāng)前正在執(zhí)行的任務(wù),直到當(dāng)前任務(wù)執(zhí)行完畢,就不會(huì)執(zhí)行下一個(gè)任務(wù)了,也就是說(shuō), 暫停其實(shí)是暫停下一個(gè)任務(wù),而不能暫停當(dāng)前任務(wù)
3)暫停是可以恢復(fù)的,只要設(shè)置隊(duì)列的suspended為NO,那么就會(huì)恢復(fù)隊(duì)列中其它任務(wù)的執(zhí)行
4歪泳、取消隊(duì)列中所有任務(wù)的執(zhí)行
[queue cancelAllOperations]
取消和暫停一樣, 是取消后面的任務(wù), 不能取消當(dāng)前正在執(zhí)行的任務(wù),取消是不可以恢復(fù)的
5露筒、管理線程的最大并發(fā)數(shù)呐伞,也就是同時(shí)執(zhí)行的任務(wù)數(shù)。
queue.maxConcurrentOperationCount = 1;
默認(rèn)是-1慎式,不能設(shè)為0伶氢,如果設(shè)置為0就不執(zhí)行任務(wù)。
四瘪吏、創(chuàng)建線程操作一共有兩種方式
1癣防、NSInvocationOperation或NSBlockOperation與NSOperationQueue搭配
1)創(chuàng)建一個(gè)線程操作
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationOperation:) object:nil];
2) 創(chuàng)建一個(gè)線程隊(duì)列
NSOperationQueue *operationQueue = [NSOperationQueue new];
3) 將創(chuàng)建好的線程操作放在線程隊(duì)列中,只有放在線程隊(duì)列中的線程操作才會(huì)在子線程中執(zhí)行。線程隊(duì)列負(fù)責(zé)管理掌眠、執(zhí)行所有的NSOperation
[operationQueue addOperation:invocationOperation];
4) 在創(chuàng)建線程操作時(shí)選擇的方法內(nèi)更新UI
- (void)invocationOperation:(NSString *)url{
//在子線程中回到主線程更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
imageView.image = [UIImage imageWithData:data];
}];
}
2蕾盯、繼承于NSOperation的子類(lèi)與NSOperationQueue的搭配
創(chuàng)建一個(gè)繼承于NSOperation的類(lèi),并在.m文件中重寫(xiě)main方法扇救,main方法便是該線程要執(zhí)行的操作刑枝。注意香嗓,如果是同步操作迅腔,該方法能夠自動(dòng)訪問(wèn)到主線程的自動(dòng)釋放池,如果是異步執(zhí)行操作靠娱,那么將無(wú)法訪問(wèn)到主線程的自動(dòng)釋放池沧烈,需要再main中再新建一個(gè)自動(dòng)釋放池,來(lái)幫助管理內(nèi)存像云。
/////////////NSThread////////////
一锌雀、基本介紹
NSThread是輕量級(jí)的多線程開(kāi)發(fā),使用并不復(fù)雜迅诬,但使用NSThread需要自己管理線程的生命周期
二腋逆、NSThread常用方法
1、使用NSThread開(kāi)辟線程的兩種方式
1)創(chuàng)建并手動(dòng)開(kāi)啟線程
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(thread:) object:nil];
[thread start];
2) 創(chuàng)建并自動(dòng)開(kāi)啟線程
[NSThread detachNewThreadSelector:@selector(compete) toTarget:self withObject:nil];
2侈贷、NSThread的常用方法
1)判斷當(dāng)前進(jìn)程是否是多線程
BOOL isMultiThread = [NSThread isMultiThreaded];
2)獲取當(dāng)前線程對(duì)象
NSLog(@"當(dāng)前所在的線程=%@",[NSThread currentThread]);
umber = 1 : 線程的編號(hào)惩歉,由系統(tǒng)設(shè)置,主線程的編號(hào)為1
name = main:指當(dāng)前所在的線程的名字叫做main,可以自己設(shè)置,主線程的名字默認(rèn)是main撑蚌,其他線程如果不給他設(shè)置名字默認(rèn)是nil
3) 使當(dāng)前線程睡眠指定的時(shí)間上遥,單位為秒,
//這句代碼在哪個(gè)線程執(zhí)行就讓哪個(gè)線程睡眠争涌。
[NSThread sleepForTimeInterval:2];
4)判斷當(dāng)前線程是否為主線程
[NSThread isMainThread];
5)設(shè)置線程名字
[thread setName:@"線程名字"];
6)NSThread對(duì)象可知的三種狀態(tài)
isExecuting:是否正在執(zhí)行粉楚,只讀
isFinished:是否已經(jīng)完成,只讀
isCancellled:是否已經(jīng)取消亮垫,可通過(guò)[thread cancel]手動(dòng)設(shè)置模软,線程取消意味著該線程處于準(zhǔn)備退出狀態(tài),但不會(huì)影響線程的運(yùn)行包警。
7)退出當(dāng)前線程
[NSThread exit];
三撵摆、NSObject中關(guān)于多線程的方法
1、在后臺(tái)執(zhí)行一個(gè)操作害晦,本質(zhì)就是重新創(chuàng)建一個(gè)線程執(zhí)行當(dāng)前方法特铝。
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg:
2、在指定的線程上執(zhí)行一個(gè)方法壹瘟,需要用戶(hù)創(chuàng)建一個(gè)線程對(duì)象鲫剿。
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait:
3、在主線程上執(zhí)行一個(gè)方法(前面已經(jīng)使用過(guò))
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait:
練習(xí): 多線程加載多張網(wǎng)絡(luò)圖片