多線程之基礎(chǔ)

基本概念

  1. 進(jìn)程: 一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動??梢岳斫獬梢粋€(gè)運(yùn)行中的應(yīng)用程序。
  2. 線程(thread): 程序執(zhí)行流的最小單元,線程是進(jìn)程中的一個(gè)實(shí)體。
  3. 同步: 只能在當(dāng)前線程按先后順序依次執(zhí)行,不開啟新線程。
  4. 異步: 可以在當(dāng)前線程開啟多個(gè)新線程執(zhí)行,可不按順序執(zhí)行。
  5. 隊(duì)列(queue): 裝載線程任務(wù)的隊(duì)形結(jié)構(gòu)。
  6. 并發(fā): 線程執(zhí)行可以同時(shí)一起進(jìn)行執(zhí)行。
  7. 串行: 線程執(zhí)行只能依次逐一先后有序的執(zhí)行。
  8. 操作(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ì)列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容