基本概念
- 進(jìn)程: 一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動??梢岳斫獬梢粋€(gè)運(yùn)行中的應(yīng)用程序。
- 線程(thread): 程序執(zhí)行流的最小單元,線程是進(jìn)程中的一個(gè)實(shí)體。
- 同步: 只能在
當(dāng)前線程按先后順序依次執(zhí)行,不開啟新線程。 - 異步: 可以在
當(dāng)前線程開啟多個(gè)新線程執(zhí)行,可不按順序執(zhí)行。 - 隊(duì)列(queue):
裝載線程任務(wù)的隊(duì)形結(jié)構(gòu)。 - 并發(fā):
線程執(zhí)行可以同時(shí)一起進(jìn)行執(zhí)行。 - 串行:
線程執(zhí)行只能依次逐一先后有序的執(zhí)行。 - 操作(Operation):
單詞:
Invoke:vt. 調(diào)用;祈求;懇求;引起
concurrency: n. 并發(fā)(性) ;全部現(xiàn)在
注意:
- 一個(gè)進(jìn)程可有多個(gè)線程。
- 一個(gè)進(jìn)程可有多個(gè)隊(duì)列。
- 隊(duì)列可分并發(fā)隊(duì)列和串行隊(duì)列。
線程的屬性
NSThread *currentThread;
NSMutableDictionary *threadDictionary;
double threadPriority
NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started
NSString *name
NSUInteger stackSize
BOOL isMainThread
NSThread *mainThread
BOOL executing
BOOL finished
BOOL cancelled
執(zhí)行分類
-
異步執(zhí)行、同步執(zhí)行
隊(duì)列分類
-
串行隊(duì)列、并發(fā)隊(duì)列
通過dispatch_queue_create函數(shù)來創(chuàng)建隊(duì)列,參數(shù)一是一個(gè)C語言的字符串,是隊(duì)列的標(biāo)簽,也就是名稱,參數(shù)二是指定串行隊(duì)列還是并發(fā)隊(duì)列。
創(chuàng)建串行隊(duì)列傳:DISPATCH_QUEUE_SERIAL(也就是NULL)
創(chuàng)建并發(fā)隊(duì)列傳:DISPATCH_QUEUE_CONCURRENT
// 創(chuàng)建串行隊(duì)列
dispatch_queue_t serialQueue = dispatch_queue_create("serial_queue", DISPATCH_QUEUE_SERIAL);
// 到隊(duì)列中異步執(zhí)行
dispatch_async(serialQueue, ^{
NSLog(@"serialQueue");
});
// 創(chuàng)建并發(fā)隊(duì)列
dispatch_queue_t concurrencyQueue = dispatch_queue_create("concurrency_queue", DISPATCH_QUEUE_CONCURRENT);
// 到隊(duì)列中異步執(zhí)行
dispatch_async(concurrencyQueue, ^{
NSLog(@"concurrency_queue");
});
隊(duì)列舉例
1. 全局隊(duì)列
蘋果預(yù)定義的全局并發(fā)隊(duì)列,只能通過蘋果提供的API來獲取,可以設(shè)置優(yōu)先級。由整個(gè)進(jìn)程共享。進(jìn)程中存在三個(gè)全局隊(duì)列:高、中(默認(rèn))、低三個(gè)優(yōu)先級隊(duì)列??梢哉{(diào)用dispatch_get_global_queue函數(shù)傳入優(yōu)先級來訪問隊(duì)列
@param identifier 優(yōu)先級 默認(rèn)成0
@param flags 0
// 到并發(fā)隊(duì)列中異步地執(zhí)行:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"async global");
});
2. 主隊(duì)列
主隊(duì)列是應(yīng)用程序啟動時(shí),由系統(tǒng)預(yù)先創(chuàng)建的,與主線程相關(guān)聯(lián)的隊(duì)列。我們只能通過系統(tǒng)API來獲取主隊(duì)列,不能手動創(chuàng)建它。下面我們來看看主隊(duì)列這個(gè)串行隊(duì)列的執(zhí)行順序如何:
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"async main");
});
參考
GCD 同步與異步 串行與并行
談iOS多線程(NSThread、NSOperation、GCD)編程
GCD串行并發(fā)隊(duì)列