自己創(chuàng)建的串行隊(duì)列會(huì)不會(huì)開啟子線程吊奢?”以下是測(cè)試代碼(在主線程執(zhí)行的):
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t serialQueue = dispatch_queue_create("serial.queue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(concurrentQueue, ^{
NSLog(@"異步 并發(fā)隊(duì)列 %@", [NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"異步 自己創(chuàng)建的串行隊(duì)列 %@", [NSThread currentThread]);
});
dispatch_async(mainQueue, ^{
NSLog(@"異步 主隊(duì)列 %@", [NSThread currentThread]);
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"同步 并發(fā)隊(duì)列 %@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"同步 自己創(chuàng)建的串行隊(duì)列 %@", [NSThread currentThread]);
});
// dispatch_sync(mainQueue, ^{
// NSLog(@"同步 主隊(duì)列 %@", [NSThread currentThread]);
// });
輸出結(jié)果為:
異步 并發(fā)隊(duì)列 <NSThread: 0x600002c9d700>{number = 3, name = (null)}
異步 自己創(chuàng)建的串行隊(duì)列 <NSThread: 0x600002cab2c0>{number = 5, name = (null)}
同步 并發(fā)隊(duì)列 <NSThread: 0x600002cc4080>{number = 1, name = main}
同步 自己創(chuàng)建的串行隊(duì)列 <NSThread: 0x600002cc4080>{number = 1, name = main}
異步 主隊(duì)列 <NSThread: 0x600002cc4080>{number = 1, name = main}
從結(jié)果上看是會(huì)創(chuàng)建子線程的艘款,總結(jié)一下就是:
并發(fā)隊(duì)列 | 自己創(chuàng)建的串行隊(duì)列 | 主隊(duì)列 | |
---|---|---|---|
異步(async) | 子線程 | 子線程 | 主線程 |
同步(sync) | 主線程 | 主線程 | 主線程 |
- 同步:需要等待任務(wù)執(zhí)行完成,所以是直接在當(dāng)前線程執(zhí)行坤塞。
- 異步:具備開啟新線程的能力必峰,不過添加到主隊(duì)列的任務(wù),都是在主線程執(zhí)行。
- 使用sync往當(dāng)前串行隊(duì)列添加任務(wù)佛致,會(huì)產(chǎn)生死鎖崩潰贮缕,可以試一下注釋掉的
dispatch_sync(mainQueue,
那段代碼。