pThead:
pThread是一套很多操作系統(tǒng)上都用到的API, 所以移植性特別強(qiáng), 同樣適用于iOS, 但是使用的比較少.
使用:
首先在需要使用pthread的文件中導(dǎo)入頭文件
#import <pthread.h>
創(chuàng)建:
第一個(gè)參數(shù): pthread指針
第二個(gè)參數(shù): 設(shè)置為NULL
第三個(gè)參數(shù): 一個(gè)函數(shù)指針, 相當(dāng)于selector
第四個(gè)參數(shù): 設(shè)置為NULL
NSThread:
NSThread經(jīng)過(guò)蘋(píng)果公司封裝后的, 完全面向?qū)ο蟮? 可以直接對(duì)線程對(duì)象進(jìn)行操作.
創(chuàng)建: 三種方式
1.
NSThread *thread = [[NSThread alloc]initWith Target:self selector:@selector(runThread) object:nil];
[threadstart];
2.?
[NSThread detachNewThreadSelector:@selector(runThread)to Target:self withObject:nil];
3.
[self performSelectorInBackground:@selector(runThread) withObject:self];
注:?
有些時(shí)候如售票, 發(fā)單等情況(需要計(jì)算數(shù)量) 要使用線程鎖, 開(kāi)啟NSThread鎖有兩種方式
1.
@synchronized(self) {
<#statements#>
}
2.
@property (nonatomic,strong) NSCondition *condition;
[self.condition lock]; ?//鎖
[self.condition unlock]; //解鎖
GCD:
GCD是蘋(píng)果為了多核的并行運(yùn)算提出的一套解決方案, 它可以合理地更多地利用CPU內(nèi)核,最重要的是它可以自動(dòng)管理線程的生命周期,比如創(chuàng)建線程, 任務(wù)調(diào)度, 銷(xiāo)毀線程,我們只需要告訴GCD要做的事情就可以了,它也是基于C語(yǔ)言的,不過(guò)里邊引入了block(OC).
劃分:
同步&異步 (以當(dāng)前線程會(huì)不會(huì)被阻塞劃分)
同步在任務(wù)執(zhí)行時(shí)會(huì)阻塞當(dāng)前線程,在任務(wù)執(zhí)行完畢后才會(huì)執(zhí)行其他任務(wù). 而異步則不會(huì)
串行&并行 (隊(duì)列相關(guān)的, 對(duì)有依賴(lài)關(guān)系的任務(wù)非常重要)
常用:
dispatch_get_main_queue : 主線程的隊(duì)列, 回到主線程, 執(zhí)行刷新UI等操作
dispatch_get_global_queue : 全局的并行隊(duì)列
第一個(gè)參數(shù)可以設(shè)置線程在并行隊(duì)列中的優(yōu)先級(jí), 共有以下幾種, 優(yōu)先級(jí)由高到低為: HIGH > DEFAULT > LOW
在并行隊(duì)列中這種設(shè)置優(yōu)先級(jí)的方式只可以影響到線程先后的執(zhí)行順序, 并不能決定線程是否可以先執(zhí)行完畢.
創(chuàng)建方式:
創(chuàng)建并行隊(duì)列:
dispatch_async(dispatch_get_global_queue(0,0), ^{
? ?//耗時(shí)操作
? ?[NSThread sleepForTimeInterval:3];
? ?dispatch_async(dispatch_get_main_queue(), ^{
? ? ? //刷新UI
? ?});
});
dispatch_queue_t? queue =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);
創(chuàng)建串行隊(duì)列:
dispatch_queue_t ?queue =dispatch_queue_create("test",DISPATCH_QUEUE_SERIAL); //第二個(gè)參數(shù)也可以傳NULL
dispatch_group_t:
使用場(chǎng)景:在多個(gè)任務(wù)異步處理之后, 需要一個(gè)統(tǒng)一的回調(diào)通知告訴我們所有的任務(wù)都結(jié)束了, 然后根據(jù)需求處理其他任務(wù), 回調(diào)通知如下:
dispatch_queue_t queue =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"test 1");
[NSThread sleepForTimeInterval:2];
NSLog(@"test 1 end");
});
dispatch_group_async(group, queue, ^{
NSLog(@"test 2");
[NSThread sleepForTimeInterval:2];
NSLog(@"test 2 end");
});
dispatch_group_async(group, queue, ^{
NSLog(@"test 3");
[NSThread sleepForTimeInterval:2];
NSLog(@"test 3 end");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"tasks over");
});
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"test 1");
[NSThread sleepForTimeInterval:2];
NSLog(@"test 1 end");
});
控制臺(tái)打印結(jié)果:
注:
當(dāng)我們要在dispatch_group_async中執(zhí)行的耗時(shí)操作(比如網(wǎng)絡(luò)請(qǐng)求回調(diào))執(zhí)行的應(yīng)該是同步操作,不應(yīng)該是異步操作, 如果要進(jìn)行異步操作,可以按如下步驟做:
dispatch_group_enter(group);
[self sendRequest:^{
NSLog(@"1");
dispatch_group_leave(group);
}];
enter要與leave成對(duì)出現(xiàn)!
GCD其他:
dispatch_once的使用:
單例:
只執(zhí)行一次的操作:
如某個(gè)按鈕只允許點(diǎn)擊一次等.
dispatch_after:
延遲執(zhí)行:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
//延遲操作
});
NSOperation:
NSOperation實(shí)際上是對(duì)GCD的一種封裝,它的實(shí)例封裝了需要執(zhí)行的操作以及執(zhí)行操作所需要的數(shù)據(jù),并且能夠以并發(fā)或者非并發(fā)執(zhí)行操作, NSOperation是一個(gè)抽象類(lèi), 我們需要使用它的子類(lèi), 有兩種使用方式:
1.NSInvocationOperation & NSBlockOperation
2.自定義類(lèi)集成NSOperation
相關(guān)概念:
1. NSOperationQueue(線程池)
? ? a. ?addOperation
? ? b. ?setMaxConcurrentOperationCount
2. 狀態(tài)
ready(執(zhí)行之前, 只有當(dāng)狀態(tài)為ready時(shí)才能進(jìn)行操作), cancelled(取消,當(dāng)執(zhí)行任務(wù)時(shí)可以進(jìn)行取消的, 如果任務(wù)正在執(zhí)行,取消無(wú)效,直到任務(wù)執(zhí)行完畢), executing(正在執(zhí)行), finished(執(zhí)行結(jié)束), asynchronous(是否是并發(fā)).
3. 依賴(lài)-addDependency
依賴(lài)關(guān)系不能相互依賴(lài)或者循環(huán)依賴(lài), 否則會(huì)造成死鎖.
NSInvocationOperation, NSBlockOperation 通常與 NSOperationQueue一起使用以達(dá)到線程異步
例:
@property(nonatomic,strong) NSOperationQueue *queue;