iOS串行隊列與線程關(guān)系勘誤

前言

為了減少錯誤觀點對他人的影響,我會把平時遇到的有些作者不嚴謹?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

推薦相關(guān)閱讀

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

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