首先沒有同步線程和異步線程這個說法的
請注意:同步操作 異步操作 串行隊列 并行對列 這個才對 和線程沒關(guān)系
一斜做、串行隊列
1、同步運行
dispatch_queue_t searialQueue =dispatch_queue_create("SearialQueue",DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue_1, ^{
NSLog(@"searialQueue = %@", [NSThreadcurrentThread]);
});
打印出的結(jié)果是 searialQueue = <NSThread: 0x7f99bad06d10>{number = 1, name = main}
也就是說在串行隊列下同步執(zhí)行绒北,線程函數(shù)會在創(chuàng)建隊列所在的線程中執(zhí)行玛瘸,不會開辟新線程
2臼疫、異步運行
dispatch_queue_t searialQueue = dispatch_queue_create("SearialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue_1, ^{
NSLog(@"searialQueue = %@", [NSThread currentThread]);
});
打印出的結(jié)果是 searialQueue = <NSThread: 0x7fe91bc0fb20>{number = 2, name = (null)}
雖然沒打印出線程的名字证杭,但從number = 2 可以看出創(chuàng)建了新的線程執(zhí)行任務(wù)徽职,也就是說在串行隊列下異步執(zhí)行枝缔,會開辟新的線程執(zhí)行操作枣抱,且不論有多好dispatch_sync熔吗,都只開辟一個線程,畢竟是串行隊列佳晶,也不難理解桅狠。
二、并行隊列
1轿秧、同步運行
dispatch_queue_t searialQueue = dispatch_queue_create("Queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue_1, ^{
NSLog(@"Queue = %@", [NSThread currentThread]);
});
打印出的結(jié)果是 Queue = <NSThread: 0x7ffc40c078d0>{number = 1, name = main}
我當初的猜想是會開辟新線程垂攘,但明顯不是,線程函數(shù)依舊在創(chuàng)建隊列所在的線程中執(zhí)行淤刃,不會開辟新線程晒他。
2、異步運行
dispatch_queue_t searialQueue = dispatch_queue_create("Queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue_1, ^{
NSLog(@"Queue = %@", [NSThread currentThread]);
});
打印出的結(jié)果是 Queue = <NSThread: 0x7fba4bc97180>{number = 2, name = (null)}
這個毫無疑問會開辟新線程執(zhí)行逸贾,而外補充一點的是陨仅,如果有此時有多個dispatch_async,就可能會開辟多少個線程執(zhí)行铝侵!
三灼伤、總結(jié):決定是否開辟新線程的是同步和異步操作,同步下不管是串行還是并行都不會開辟新線程咪鲜。
串行隊列:同步:不開辟線程狐赡,在隊列所在的線程執(zhí)行
異步:開辟新線程(且僅一個)
并行隊列:同步:不開辟線程,在隊列所在的線程執(zhí)行
異步:開辟新線程疟丙,個數(shù)由任務(wù)的個數(shù)等決定
dispatch_queue_t q = dispatch_queue_create("duilie", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(q, ^{
NSLog(@"%@ %d", [NSThread currentThread], i);
});
應(yīng)該這么理解
將 NSLog(@"%@ %d", [NSThread currentThread], i); 這個任務(wù)加到q隊列(可以是串行或者并行)中執(zhí)行颖侄,然后q隊列又是dispatch_async這種執(zhí)行順序鸟雏,如果同步執(zhí)行那就在q隊列所在線程順序執(zhí)行不會開辟新線程,如果是并行執(zhí)行,那如果創(chuàng)建的隊列是異步隊列就可能開辟多個線程,如果是同步隊列那就只會開辟一個線程览祖。如果q隊列和外部所在的隊列一樣可能會死鎖哦(就像主隊列)
同步操作dispatch_sync 和 異步操作dispatch_async 是放在隊列中的
關(guān)于同步和異步的理解:
同步操作dispatch_sync 其實我是這樣理解的孝鹊,就是他阻塞了當前線程,需要等當前線程展蒂,在這個操作之前的任務(wù)必須完成才會往下走又活。
異步操作dispatch_async 其實我是這樣理解的,就是他不阻塞了當前線程锰悼,不需要等當前線程柳骄,不管你在這個操作之前的任務(wù)是否完成就會往下走。
dispatch_barrier_sync 和dispatch_barrier_async
iOS開發(fā)系列-線程同步dispatch_barrier_(a)sync:http://www.reibang.com/p/68a23031b1c1
個人理解就是
可以把它拆開來dispatch_barrier +(a)sync
柵欄函數(shù)dispatch_barrier 作用是控制隊列中的任務(wù)執(zhí)行的順序 順序:柵欄前的任務(wù)全執(zhí)行—》柵欄任務(wù)—》柵欄后的任務(wù)
(a)sync和原先理解的一樣(就是這個柵欄任務(wù)加入隊列的執(zhí)行順序)
同步柵欄就相當于一個斷點箕般,在同一個對列里柵欄任務(wù)前插入的任務(wù)沒有完成時耐薯,這個隊列后面的任務(wù)就被阻塞了
異步柵欄就是我只管 在同一個對列里柵欄任務(wù)前插入的任務(wù)完成后我才執(zhí)行我的柵欄任務(wù),其他我不管
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者