前言
為了減少錯誤觀點對他人的影響,我會把平時遇到的有些作者不嚴謹?shù)牟┛图夹g(shù)點或者觀點在這里進行勘誤。
今天要說的是串行隊列和異步執(zhí)行的一個誤解。
原作者博客地址
原作者介紹了線程和隊列的關(guān)系,并且得出如下結(jié)論:
串行: 任務(wù)以FIFO從序列中一個一個執(zhí)行。一次只調(diào)度一個任務(wù),隊列中的任務(wù)一個接著一個地執(zhí)行(一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù))而且只會開啟一條線程。
首先這是個錯誤觀點,或者說非常不嚴謹。
作者的for循環(huán),創(chuàng)建的線程內(nèi)部任務(wù)并不耗時,并且線程使用完后并不會立即就被銷毀,如果在被銷毀之前又有新的任務(wù),那就會繼續(xù)執(zhí)行任務(wù),所以作者因此認為,串行隊列只開啟一條線程,這里會讓許多人誤認為,串行隊列只可能在一條線程上執(zhí)行。
其實多個線程是可以執(zhí)行同一個串行隊列中的任務(wù)的,如下示例:
dispatch_queue_t serialQueue = dispatch_queue_create("q_queue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
sleep(3);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
NSLog(@"1");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
sleep(1);
NSLog(@"2");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"3");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
sleep(5);
NSLog(@"4");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"5");
NSLog(@"%@", [NSThread currentThread]);
});
結(jié)果可以看出:
有線程3和線程4執(zhí)行了串行隊列中的任務(wù)。

image.png