同步任務(wù)、異步任務(wù)在不同隊列中執(zhí)行的情況分析

之前去面試時被考官給的一道多線程任務(wù)執(zhí)行順序問題給問到了,之前對這塊一直學(xué)得不清不楚昼丑,現(xiàn)在剛好有空測試一下。下面先上代碼與執(zhí)行結(jié)果:

????dispatch_queue_t serialQueue = dispatch_queue_create("串行隊列", DISPATCH_QUEUE_SERIAL);

? ? dispatch_queue_tconcurrentQueue =dispatch_queue_create("并行隊列",DISPATCH_QUEUE_CONCURRENT);


? ? dispatch_queue_t mainQueue = dispatch_get_main_queue();

? ? dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


? ? //1

? ? for (inti =0; i <10; i++) {

? ? ? ? dispatch_sync(serialQueue, ^{

? ? ? ? ? ? NSLog(@"任務(wù)執(zhí)行中夸赫。菩帝。。-%d, mainThread:%@",i,[NSThread currentThread]);

? ? ? ? });

? ? }

? ? /*

?? ? 2018-08-22 16:45:56.881958+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中茬腿。呼奢。。-0, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882092+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中切平。握础。。-1, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882174+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中悴品。禀综。。-2, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882236+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中苔严。定枷。。-3, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882293+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中届氢。欠窒。。-4, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882348+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中退子。贱迟。姐扮。-5, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882469+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中。衣吠。茶敏。-6, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882551+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中。缚俏。惊搏。-7, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882617+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中。忧换。恬惯。-8, mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:45:56.882677+0800 ttttt[11609:14893507] 任務(wù)執(zhí)行中。亚茬。酪耳。-9, mainThread:{number = 1, name = main}

?? ? */

? ? //運行結(jié)果是,同步任務(wù)在串行隊列中刹缝,在主線程下串行執(zhí)行



? ? //2

? ? for (inti=0; i<5; i++) {

? ? ? ? dispatch_sync(concurrentQueue, ^{

? ? ? ? ? ? NSLog(@"同步任務(wù)在并行隊列執(zhí)行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

? ? ? ? });

? ? }

? ? /*

?? ? 同步任務(wù)在并行隊列執(zhí)行中....-0

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:50:37.411207+0800 ttttt[11688:14904522] 同步任務(wù)在并行隊列執(zhí)行中....-1

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:50:37.411339+0800 ttttt[11688:14904522] 同步任務(wù)在并行隊列執(zhí)行中....-2

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:50:37.411417+0800 ttttt[11688:14904522] 同步任務(wù)在并行隊列執(zhí)行中....-3

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 16:50:37.411527+0800 ttttt[11688:14904522] 同步任務(wù)在并行隊列執(zhí)行中....-4

?? ? mainThread:{number = 1, name = main}

?? ? */

? ? //結(jié)果碗暗,同步任務(wù)在并行隊列中,在主線程下串行執(zhí)行



? ? //3

//? ? for(int i=0;i<10;i++){

//? ? ? ? ? ? dispatch_sync(mainQueue, ^{

//? ? ? ? ? ? ? ? NSLog(@"任務(wù)執(zhí)行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//? ? ? ? ? ? });

//? ? ? ? }

? ? //結(jié)果梢夯,同步任務(wù)在主隊列中言疗,鎖死



? ? //4

? ? for (inti=0; i<5; i++) {

? ? ? ? dispatch_sync(globalQueue, ^{

? ? ? ? ? ? NSLog(@"同步任務(wù)在全局隊列執(zhí)行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

? ? ? ? });

? ? }

? ? /*

?? ? 2018-08-22 17:03:36.779303+0800 ttttt[11929:14946556] 同步任務(wù)在全局隊列執(zhí)行中....-0

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:03:36.779507+0800 ttttt[11929:14946556] 同步任務(wù)在全局隊列執(zhí)行中....-1

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:03:36.779630+0800 ttttt[11929:14946556] 同步任務(wù)在全局隊列執(zhí)行中....-2

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:03:36.779729+0800 ttttt[11929:14946556] 同步任務(wù)在全局隊列執(zhí)行中....-3

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:03:36.779884+0800 ttttt[11929:14946556] 同步任務(wù)在全局隊列執(zhí)行中....-4

?? ? mainThread:{number = 1, name = main}

?? ? */

? ? //結(jié)果,同步任務(wù)在全局隊列中颂砸,在主線程下串行執(zhí)行



? ? //5

? ? for (inti=0; i<10; i++) {

? ? ? ? dispatch_async(serialQueue, ^{

? ? ? ? ? ? NSLog(@"異步任務(wù)在串行隊列執(zhí)行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

? ? ? ? });

? ? }

? ? /*

?? ? 2018-08-22 17:06:58.915475+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-0

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.915556+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-1

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.915690+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-2

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.916051+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-3

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.916435+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-4

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.916613+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-5

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.917091+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-6

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.917218+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-7

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.917451+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-8

?? ? mainThread:{number = 3, name = (null)}

?? ? 2018-08-22 17:06:58.917571+0800 ttttt[11993:14954479] 異步任務(wù)在串行隊列執(zhí)行中....-9

?? ? mainThread:{number = 3, name = (null)}

?? ? */

? ? //結(jié)果噪奄,異步任務(wù)在串行隊列中,是在一個子線程中串行執(zhí)行



? ? //6

? ? for (inti=0; i<5; i++) {

? ? ? ? dispatch_async(concurrentQueue, ^{

?? ? ? ? ? NSLog(@"異步任務(wù)在并行隊列執(zhí)行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

? ? ? ? });

? ? }

? ? /*

?? ? 2018-08-22 17:11:37.539218+0800 ttttt[12080:14967734] 異步任務(wù)在并行隊列執(zhí)行中....-1

?? ? mainThread:{number = 5, name = (null)}

?? ? 2018-08-22 17:11:37.539219+0800 ttttt[12080:14967733] 異步任務(wù)在并行隊列執(zhí)行中....-0

?? ? mainThread:{number = 4, name = (null)}

?? ? 2018-08-22 17:11:37.539249+0800 ttttt[12080:14967736] 異步任務(wù)在并行隊列執(zhí)行中....-2

?? ? mainThread:{number = 6, name = (null)}

?? ? 2018-08-22 17:11:37.539522+0800 ttttt[12080:14967744] 異步任務(wù)在并行隊列執(zhí)行中....-3

?? ? mainThread:{number = 7, name = (null)}

?? ? 2018-08-22 17:11:37.539566+0800 ttttt[12080:14967745] 異步任務(wù)在并行隊列執(zhí)行中....-4

?? ? mainThread:{number = 8, name = (null)}

?? ? */

? ? //結(jié)果人乓,異步任務(wù)在并行隊列中勤篮,是在多個子線程中并行執(zhí)行,順序不確定




? ? //7

? ? for (inti=0; i<7; i++) {

? ? ? ? dispatch_async(mainQueue, ^{

? ? ? ? ? ? NSLog(@"異步任務(wù)在主隊列執(zhí)行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

? ? ? ? });

? ? }

? ? /*

?? ? 2018-08-22 17:18:08.413412+0800 ttttt[12189:14986737] 異步任務(wù)在主隊列執(zhí)行中....-1

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:18:08.413520+0800 ttttt[12189:14986737] 異步任務(wù)在主隊列執(zhí)行中....-2

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:18:08.413746+0800 ttttt[12189:14986737] 異步任務(wù)在主隊列執(zhí)行中....-3

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:18:08.413923+0800 ttttt[12189:14986737] 異步任務(wù)在主隊列執(zhí)行中....-4

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:18:08.414136+0800 ttttt[12189:14986737] 異步任務(wù)在主隊列執(zhí)行中....-5

?? ? mainThread:{number = 1, name = main}

?? ? 2018-08-22 17:18:08.414205+0800 ttttt[12189:14986737] 異步任務(wù)在主隊列執(zhí)行中....-6

?? ? mainThread:{number = 1, name = main}

?? ? */

? ? //結(jié)果色罚,異步任務(wù)在主隊列中執(zhí)行碰缔,是在主線程中串行執(zhí)行



? ? //8

? ? for (inti=0; i<6; i++) {

? ? ? ? dispatch_async(globalQueue, ^{

? ? ? ? ? ? NSLog(@"異步任務(wù)在全局隊列執(zhí)行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

? ? ? ? });

? ? }

? ? /*

?? ? 2018-08-22 17:22:04.895288+0800 ttttt[12266:14996623] 異步任務(wù)在全局隊列執(zhí)行中....-0

?? ? mainThread:{number = 9, name = (null)}

?? ? 2018-08-22 17:22:04.895322+0800 ttttt[12266:14996624] 異步任務(wù)在全局隊列執(zhí)行中....-1

?? ? mainThread:{number = 10, name = (null)}

?? ? 2018-08-22 17:22:04.895344+0800 ttttt[12266:14996625] 異步任務(wù)在全局隊列執(zhí)行中....-2

?? ? mainThread:{number = 11, name = (null)}

?? ? 2018-08-22 17:22:04.895397+0800 ttttt[12266:14996626] 異步任務(wù)在全局隊列執(zhí)行中....-3

?? ? mainThread:{number = 12, name = (null)}

?? ? 2018-08-22 17:22:04.895470+0800 ttttt[12266:14996629] 異步任務(wù)在全局隊列執(zhí)行中....-5

?? ? mainThread:{number = 14, name = (null)}

?? ? 2018-08-22 17:22:04.895475+0800 ttttt[12266:14996628] 異步任務(wù)在全局隊列執(zhí)行中....-4

?? ? mainThread:{number = 13, name = (null)}

?? ? */

? ? //結(jié)果,異步任務(wù)在全局隊列中執(zhí)行保屯,是在多個子線程中并行執(zhí)行

總結(jié):

1手负、同步任務(wù)在自定義串行隊列、自定義并行隊列以及全局隊列中執(zhí)行時姑尺,都是在當(dāng)前線程中串行執(zhí)行(我的測試代碼中是在主線程中提交任務(wù)竟终,所以結(jié)果顯示是在主線程中串行執(zhí)行);但是同步任務(wù)在主隊列中執(zhí)行會造成死鎖切蟋,死鎖具體原因隨后在開篇記錄统捶。

2、異步任務(wù)在自定義串行隊列、自定義并行隊列以及全局隊列中執(zhí)行時喘鸟,都是會開辟子線程執(zhí)行匆绣,串行隊列會開辟一條子線程串行執(zhí)行,并行隊列和全局隊列中會開辟多條子線程并行執(zhí)行什黑;但是異步任務(wù)在主隊列中執(zhí)行時崎淳,不會開辟子線程,而是會在主隊列所屬的主線程中串行執(zhí)行愕把。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拣凹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恨豁,更是在濱河造成了極大的恐慌嚣镜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橘蜜,死亡現(xiàn)場離奇詭異菊匿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)计福,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門跌捆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棒搜,你說我怎么就攤上這事疹蛉』罨” “怎么了力麸?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長育韩。 經(jīng)常有香客問我克蚂,道長,這世上最難降的妖魔是什么筋讨? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任埃叭,我火速辦了婚禮,結(jié)果婚禮上悉罕,老公的妹妹穿的比我還像新娘赤屋。我一直安慰自己,他們只是感情好壁袄,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布类早。 她就那樣靜靜地躺著,像睡著了一般嗜逻。 火紅的嫁衣襯著肌膚如雪涩僻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音逆日,去河邊找鬼嵌巷。 笑死,一個胖子當(dāng)著我的面吹牛室抽,可吹牛的內(nèi)容都是我干的搪哪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼坪圾,長吁一口氣:“原來是場噩夢啊……” “哼噩死!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起神年,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤已维,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后已日,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垛耳,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年飘千,在試婚紗的時候發(fā)現(xiàn)自己被綠了堂鲜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡护奈,死狀恐怖缔莲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霉旗,我是刑警寧澤痴奏,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站厌秒,受9級特大地震影響读拆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸵闪,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一檐晕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚌讼,春花似錦辟灰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夏志,卻和暖如春乃坤,著一層夾襖步出監(jiān)牢的瞬間苛让,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工湿诊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留狱杰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓厅须,卻偏偏與公主長得像仿畸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朗和,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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