iOS開發(fā)之線程管理器 OperationManager

iOS中線程管理可以通過以下四種方式
pthread
NSThread
GCD
NSOperationQueue

同步(sync)異步(async)
串行隊列(serial)并行隊列(concurrent)

1.同步(Synchronous) vs 異步(Asychronous)

同步會阻塞線程曾掂,順序執(zhí)行任務(wù)
異步不會阻塞當(dāng)前前程熟妓。mian隊列除外傲宜,在主線程中同步和異步執(zhí)行都會阻塞主線程器瘪,且不會另開線程洞焙,永遠不要使用sync向主隊列中添加任務(wù),

2.串行和并發(fā)隊列

DISPATCH_QUEUE_SERIAL 串行隊列
DISPATCH_QUEUE_CONCURRENT 并發(fā)隊列

3.主隊列和全局并發(fā)隊列

dispatch_get_global_queue 全局并發(fā)隊列
dispatch_get_main_queue 主隊列串行隊列(主隊列中的任務(wù)都會在主線程上執(zhí)行)

同步執(zhí)行串行隊列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);//  串行隊列
NSLog(@"串行隊列中同步執(zhí)行1 - %@", [NSThread currentThread]);
for(int i = 0;i<10;i++){
    //  多次向串行隊列同步添加任務(wù)
    dispatch_sync(queue, ^{
        NSLog(@"串行隊列中同步執(zhí)行21%d - %@",i, [NSThread currentThread]);
    });
    
}
NSLog(@"串行隊列中同步執(zhí)行3 - %@", [NSThread currentThread]);
sync&serial.png
異步執(zhí)行串行隊列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
  NSLog(@"串行隊列中異步執(zhí)行1 - %@", [NSThread currentThread]);
  //  異步
  for(int i = 0;i<10;i++){
      dispatch_async(queue, ^{
      NSLog(@"串行隊列中異步執(zhí)行21%d - %@",i, [NSThread currentThread]);
      });
  }
NSLog(@"串行隊列中異步執(zhí)行3 - %@", [NSThread currentThread]);
![Uploading sync&concurrent_235538.png . . .]
同步執(zhí)行并行隊列
dispatch_queue_t queue0 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
   NSLog(@"并發(fā)隊列中同步執(zhí)行1 - %@", [NSThread currentThread]);

   for(int i = 0;i<10;i++){
       dispatch_sync(queue0, ^{
       NSLog(@"并發(fā)隊列中同步執(zhí)行21%d - %@",i, [NSThread currentThread]);
       });

   }

NSLog(@"并發(fā)隊列中同步執(zhí)行3 - %@", [NSThread currentThread]);
sync&concurrent.png
異步執(zhí)行并發(fā)隊列
dispatch_queue_t queue0 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"并發(fā)隊列中異步執(zhí)行1 - %@", [NSThread currentThread]);
for(int i = 0;i<10;i++){
    //  多次添加任務(wù)
    dispatch_async(queue0, ^{
        NSLog(@"并行隊列中異步執(zhí)行21%d - %@",i, [NSThread currentThread]);
    });
}
NSLog(@"并發(fā)隊列中異步執(zhí)行3 - %@", [NSThread currentThread]);
asyn&concurrent.png
異步執(zhí)行主隊列
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"主隊列中異步執(zhí)行1 - %@", [NSThread currentThread]);

//  異步
for(int i = 0;i<8;i++){
    dispatch_async(queue, ^{
    NSLog(@"主隊列中異步執(zhí)行21%d - %@",i, [NSThread currentThread]);
    });
}
for(int i = 0;i<5;i++){
    NSLog(@"主隊列中異步執(zhí)行3%d - %@",i, [NSThread currentThread]);
}
asyn&main_serial.png

主隊列中膨疏,即使有異步任務(wù)九火,也會依次在主線程上執(zhí)行,異步任務(wù)會等主線程上的任務(wù)執(zhí)行完再執(zhí)行俱尼。

同步執(zhí)行主隊列
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"主隊列中同步執(zhí)行1 - %@", [NSThread currentThread]);

//  同步
for(int i = 0;i<10;i++){
    dispatch_sync(queue, ^{
        NSLog(@"主隊列中同步執(zhí)行21%d - %@",i, [NSThread currentThread]);
    });
    
}
NSLog(@"主隊列中同步執(zhí)行3 - %@", [NSThread currentThread]);
sync_main_serial.png

以上發(fā)生了死鎖
同步和異步?jīng)Q定了是否開啟新線程抖单。mian隊列除外,在主線程中同步和異步執(zhí)行都會阻塞主線程遇八,且不會另開線程矛绘,永遠不要使用sync向主隊列中添加任務(wù)

小結(jié):
同步執(zhí)行 串行隊列 不開啟新線程,在原線程中串行執(zhí)行隊列
同步執(zhí)行 并行隊列 不開啟新線程押蚤,在原線程中串行執(zhí)行隊列
異步執(zhí)行 串行隊列 開啟新線程蔑歌,在新線程中串行執(zhí)行隊列
異步執(zhí)行 并行隊列 開啟多個線程執(zhí)行任務(wù)
補充:
異步執(zhí)行主隊列 不開啟新線程,在原線程中串行執(zhí)行隊列揽碘,主線程任務(wù)執(zhí)行完后任在主線程執(zhí)行想異步執(zhí)行的任務(wù)

死鎖

了解了同步次屠,異步,串行雳刺,并發(fā)后劫灶,看看以下代碼

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"之前1 - %@", [NSThread currentThread]);
//  異步執(zhí)行串行隊列
dispatch_async(queue, ^{
    NSLog(@"sync之前2 - %@", NSThread.currentThread);
    dispatch_sync(queue, ^{
        NSLog(@"sync3 - %@", NSThread.currentThread);
    });
    NSLog(@"sync之后4 - %@", NSThread.currentThread);
});
NSLog(@"之后5 - %@", NSThread.currentThread);
打印結(jié)果1.png

上面代碼發(fā)生了死鎖,3掖桦,4不執(zhí)行,異步開啟一個線程 執(zhí)行串行隊列 串行隊列里同步會發(fā)生死鎖本昏!同樣的,在主線程中枪汪,以下代碼也發(fā)生了死鎖

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"之前1 - %@", [NSThread currentThread]);
//  同步執(zhí)行串行隊列
dispatch_sync(queue, ^{
    NSLog(@"sync之前2 - %@", NSThread.currentThread);
    //  再次向串行隊列中添加同步執(zhí)行串行隊列任務(wù)
    dispatch_sync(queue, ^{
        NSLog(@"sync3 - %@", NSThread.currentThread);
    });
    NSLog(@"sync之后4 - %@", NSThread.currentThread);
});
NSLog(@"之后5 - %@", NSThread.currentThread);
打印結(jié)果2.png

在主線程中死鎖涌穆,3,4雀久,5都沒有執(zhí)行
在一個線程中串行執(zhí)行的隊列里宿稀,再次添加同步執(zhí)行該隊列,會發(fā)生死鎖赖捌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祝沸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罩锐,老刑警劉巖奉狈,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涩惑,居然都是意外死亡仁期,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門竭恬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莲镣,“玉大人惶岭,你說我怎么就攤上這事∫硭辏” “怎么了悦析?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵寿桨,是天一觀的道長。 經(jīng)常有香客問我强戴,道長亭螟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任骑歹,我火速辦了婚禮预烙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘道媚。我一直安慰自己扁掸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布最域。 她就那樣靜靜地躺著谴分,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镀脂。 梳的紋絲不亂的頭發(fā)上牺蹄,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音薄翅,去河邊找鬼沙兰。 笑死,一個胖子當(dāng)著我的面吹牛翘魄,可吹牛的內(nèi)容都是我干的鼎天。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼熟丸,長吁一口氣:“原來是場噩夢啊……” “哼训措!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤绩鸣,失蹤者是張志新(化名)和其女友劉穎怀大,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呀闻,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡化借,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捡多。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖康。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垒手,靈堂內(nèi)的尸體忽然破棺而出蒜焊,到底是詐尸還是另有隱情,我是刑警寧澤科贬,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布泳梆,位于F島的核電站,受9級特大地震影響榜掌,放射性物質(zhì)發(fā)生泄漏优妙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一憎账、第九天 我趴在偏房一處隱蔽的房頂上張望套硼。 院中可真熱鬧,春花似錦胞皱、人聲如沸邪意。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抄罕。三九已至,卻和暖如春于颖,著一層夾襖步出監(jiān)牢的瞬間呆贿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工森渐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留做入,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓同衣,卻偏偏與公主長得像竟块,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耐齐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容