案例一:主隊列,同步線程
NSLog(@"dispatch_queue_1");//任務(wù)一
dispatch_sync(dispatch_get_main_queue(), ^{
});
NSLog(@"dispatch_queue_3");// 任務(wù)三
// 輸出: dispatch_queue_1
- 任務(wù)1執(zhí)行后弟塞,同步線程任務(wù)2加到主隊列中凭峡,任務(wù)3會等待任務(wù)2執(zhí)行完成后執(zhí)行
- 對于隊列,有任務(wù)來决记,會將任務(wù)加到隊尾,然后遵循FIFO原則執(zhí)行任務(wù)倍踪,任務(wù)2會被添加到隊列的隊尾系宫,在任務(wù)3的后面,會等待任務(wù)3執(zhí)行完畢后執(zhí)行
- 綜上任務(wù)2等待3的執(zhí)行建车,同時任務(wù)3等到任務(wù)2的執(zhí)行扩借,從而造成了死鎖
案例二:主隊列,異步線程
NSLog(@"dispatch_queue_1");//任務(wù)1
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"dispatch_queue_2");// 任務(wù)二
});
NSLog(@"dispatch_queue_3");// 任務(wù)三
// 輸出:
dispatch_queue_1
dispatch_queue_3
dispatch_queue_2
- 任務(wù)1執(zhí)行后缤至,異步線程任務(wù)2加到主隊列中潮罪,任務(wù)3不會等待任務(wù)2執(zhí)行完成后執(zhí)行
- 對于隊列,有任務(wù)來领斥,會將任務(wù)加到隊尾嫉到,然后遵循FIFO原則執(zhí)行任務(wù),任務(wù)2會被添加到隊列的隊尾月洛,在任務(wù)3的后面何恶,會等待任務(wù)3執(zhí)行完畢后執(zhí)行
- 綜上任務(wù)2等待3的執(zhí)行,任務(wù)3不會等到任務(wù)2的執(zhí)行嚼黔,從而不會造成死鎖细层,任務(wù)執(zhí)行順序是 1 3 2.
案例三:全局隊列,同步線程
NSLog(@"dispatch_queue_1");//任務(wù)1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"dispatch_queue_2");//任務(wù)2
});
NSLog(@"dispatch_queue_3");// 任務(wù)3
// 輸出:
dispatch_queue_1
dispatch_queue_2
dispatch_queue_3
- 任務(wù)1執(zhí)行后唬涧,同步線程任務(wù)2加到全局對列(Global Queue)中疫赎,任務(wù)3會等待任務(wù)2執(zhí)行完成后執(zhí)行
- 對于任務(wù)2,因為實在全局隊列(Global Queue)中碎节,它的執(zhí)行不受主隊列任務(wù)的影響捧搞,所以任務(wù)2在全局隊列執(zhí)行完畢之后會返回到主隊列執(zhí)行任務(wù)3
- 綜上任務(wù)3等待全局隊列中的同步任務(wù)2的執(zhí)行,任務(wù)2的執(zhí)行不會阻塞钓株,從而不會造成死鎖实牡,任務(wù)執(zhí)行順序是 1 2 3.
案例四:全局隊列,異步線程
NSLog(@"dispatch_queue_1");//任務(wù)1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"dispatch_queue_2");//任務(wù)2
});
NSLog(@"dispatch_queue_3");// 任務(wù)3
// 輸出:
dispatch_queue_1
dispatch_queue_2
dispatch_queue_3
or
dispatch_queue_1
dispatch_queue_3
dispatch_queue_2
- 任務(wù)1執(zhí)行后轴合,異步線程任務(wù)2加到全局對列(Global Queue)中创坞,任務(wù)3不會等待任務(wù)2執(zhí)行完成后執(zhí)行
- 對于任務(wù)2,因為實在全局隊列(Global Queue)中受葛,它的執(zhí)行不受主隊列任務(wù)的影響
- 綜上任務(wù)3不會等待全局隊列中的異步任務(wù)2的執(zhí)行题涨,任務(wù)2的執(zhí)行不會阻塞偎谁,從而不會造成死鎖,任務(wù)執(zhí)行順序是 1 2 3 or 1 3 2.
案例五:串行隊列纲堵,異步巡雨、同步線程
dispatch_queue_t queue = dispatch_queue_create("com.gcd.serialqueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"dispatch_queue_1");//任務(wù)1
_async(queue, ^{
NSLog(@"dispatch_queue_2");//任務(wù)2
dispatch_sync(queue, ^{
NSLog(@"dispatch_queue_3");//任務(wù)3
});
NSLog(@"dispatch_queue_4");//任務(wù)4
});
NSLog(@"dispatch_queue_5");//任務(wù)5
- 任務(wù)1執(zhí)行完成之后席函,將異步線程任務(wù)2铐望,同步隊列和任務(wù)4加入到串行隊列,任務(wù)5不需要等待任務(wù)2茂附,所以任務(wù)2和任務(wù)5的執(zhí)行順序不一定正蛙。
- 任務(wù)2執(zhí)行完成后,同步線程的任務(wù)3加入到串行隊列营曼,任務(wù)4的執(zhí)行等待任務(wù)3的執(zhí)行完成
- 對于隊列乒验,有任務(wù)來,會將任務(wù)加到隊尾蒂阱,然后遵循FIFO原則執(zhí)行任務(wù)锻全,任務(wù)3會被添加到隊列的隊尾,在任務(wù)4的后面录煤,會等待任務(wù)4執(zhí)行完畢后執(zhí)行
- 綜上所述鳄厌,任務(wù)3和任務(wù)4陷入無限的等待中,造成死鎖
案例六:異步線程辐赞、全局隊列部翘,同步線程,主隊列
/*
1:加入到Main Queue中的有 任務(wù)1响委,異步線程新思、全局隊列,任務(wù)5
2:加入到 Global Queue中的有 任務(wù)2赘风,同步線程夹囚,主隊列,任務(wù)4
*/
NSLog(@"dispatch_queue_1");//任務(wù)1
// 執(zhí)行完任務(wù)1后邀窃,將異步線程的任務(wù)2加到Global Queue中荸哟,所以任務(wù)5不用等待,結(jié)果就是2和5的輸出順序不一定
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"dispatch_queue_2");//任務(wù)2
// 執(zhí)行完任務(wù)2瞬捕,將同步線程的任務(wù)添加到主隊列中鞍历,這時任務(wù)3在任務(wù)5后面。
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"dispatch_queue_3");//任務(wù)3
});
// 未發(fā)生阻塞肪虎,執(zhí)行任務(wù)4
NSLog(@"dispatch_queue_4");//任務(wù)4
});
NSLog(@"dispatch_queue_5");//任務(wù)5
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者