java sync和async区别_GCD中串行、并行与async、sync的区别
* author:conowen@大鐘
* E-mail:conowen@hotmail.com
隊列由一個或多個任務組成,當這些任務要開始執(zhí)行時,系統(tǒng)會分別把他們分配到某個線程上去執(zhí)行。
串行隊列、并行隊列
GCD編程中,創(chuàng)建一個隊列代碼如下
dispatch_queue_t queue_t_concurrent = dispatch_queue_create("com.conowen.concurrent", DISPATCH_QUEUE_CONCURRENT);//concurrent
dispatch_queue_t queue_t_serial = dispatch_queue_create("com.conowen.serial", DISPATCH_QUEUE_SERIAL);//serial
DISPATCH_QUEUE_SERIAL的值為NULL
如果有以下任務:[任務A,任務B,任務C,任務D]
按照順序放在串行隊列中運行,那么最終得到結(jié)果的順序也是ABCD的順序,假若放在并行隊列中運行,結(jié)果的順序是隨機的。
async、sync
async
使用dispatch_async 調(diào)用一個block,如:dispatch_async(myQueue,myBlock);這個myBlock會被放到myQueue隊列的隊尾等待執(zhí)行,這時候,這個myBlock任務并沒有串行與并行一說,如果myQueue是并行,那么這個myBlock任務就是并行運行,如果myQueue是串行隊列,那么這個MyBlock就是串行運行,但是dispatch_async會馬上結(jié)束并且返回。
dispatch_async(myQueue, ^{
//do something
});
sync
使用dispatch_sync ,如dispatch_sync(myQueue,myBlock);,同樣也是把myBlock任務放到myQueue上面執(zhí)行,但是dispatch_sync會等待這個myBlock執(zhí)行完畢才會結(jié)束返回,也就是說,它會一直阻塞當前dispatch_sync所在的線程直到myQueue隊列中myBlock任務執(zhí)行完,返回。
隊列與線程的關(guān)系
iOS中一般有串行隊列,并發(fā)隊列,全局隊列(并行),主隊列(串行)。
首先,要先說說主線程隊列(串行),不管同步或者是異步,都只運行在主線程中。
同步(sync) 異步開啟任務的時候,無論是串行還是并行,都不會創(chuàng)建新的線程,Block只會運行在當前線程。
異步(async)異步開啟任務的時候,無論是串行還是并行,都會開辟一條新的線程。區(qū)別在于,串行隊列開辟一條線程。并行隊列則開辟多條線程
需要注意的是,同步(sync)的時候,傳入的是主線程隊列(串行),而如果當前線程不是主線程,那么Block的任務只跑在主線程中,并非跑在當前線程。
使用GCD技術(shù)實現(xiàn)多線程的時候,GCD會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務、銷毀線程)。
經(jīng)典的死鎖問題
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
因為^{NSLog(@"2");}這個Block放在dispatch_get_main_queue()主串行隊列中執(zhí)行,但是由于是串行隊列,Block并不會立馬就執(zhí)行,(要排隊),所以dispatch_sync會阻塞主線程,等待main_queue//主線程中的Block執(zhí)行完畢,但是由于主線程被阻塞了,Block中的代碼永遠不會執(zhí)行,這樣就導致的死鎖。
sync在串行隊列
上面的主線程死鎖問題就是 sync在串行隊列運行的,(主線程是串行隊列)
sync在并行隊列
但是如果是以下代碼就不會導致死鎖
dispatch_queue_t queue_t_concurrent = dispatch_queue_create("com.conowen.concurrent", DISPATCH_QUEUE_CONCURRENT);//concurrent
dispatch_async(queue_t_concurrent, ^{
dispatch_sync(queue_t_concurrent, ^{
NSLog(@"2");
});
});
因為Block 在并行隊列中(不用在隊列中排隊),會被立刻執(zhí)行,然后返回結(jié)果,所以dispatch_sync也不會等待出現(xiàn)一直等待Block結(jié)果的狀態(tài),這時候不會出現(xiàn)死鎖情況。
所以蘋果廢棄掉了dispatch_get_current_queue方法,就是怕會出現(xiàn)以下代碼導致死鎖。
dispatch_queue_t queue_t_serial = dispatch_queue_create("com.conowen.serial", DISPATCH_QUEUE_SERIAL);//serial
dispatch_async(queue_t_serial, ^{
dispatch_sync(dispatch_get_current_queue(), ^{
NSLog(@"0");
});
});
總結(jié)
以上是生活随笔為你收集整理的java sync和async区别_GCD中串行、并行与async、sync的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 19位整数 java_为什么阿里巴巴J
- 下一篇: java 命令行导入jar包,如何使用命