日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java sync和async区别_GCD中串行、并行与async、sync的区别

發(fā)布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java sync和async区别_GCD中串行、并行与async、sync的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

* 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。