Objective-C IOS多線程之GCD深入理解,objective-cgcd

來源:互聯網
上載者:User

Objective-C IOS多線程之GCD深入理解,objective-cgcd

在 GCD 中,加入了兩個非常重要的概念:任務和隊列
一個線程是可以擁有多個執行隊列的,所有任務是添加到隊列中等待執行的
主隊列是特殊的串列隊列,自己建立的隊列可以指定串列或並行,全域隊列是並行隊列

任務:即操作,你想要幹什麼,說白了就是一段代碼,在 GCD 中就是一個 Block,所以新增工作十分方便。
任務有兩種執行方式: 同步執行和非同步執行,他們之間的區別主要在於會不會阻塞當前線程

首先看下面這兩個例子:

1、

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);dispatch_sync(queue, ^{NSLog(@"%d",[[NSThread currentThread] isMainThread]);});

2、

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);dispatch_async(queue, ^{NSLog(@"%d",[[NSThread currentThread] isMainThread]);});

兩個例子都是建立一個新隊列,之間的區別只在於前者是以同步運行,後者則是非同步
結果前者列印出1,後者則是0。

我們分析一下,這裡同步的意思其實是對於線程的所有執行隊列而言,就是說同步執行時,除了block任務,在同一個線程執行的其他隊列全部暫停執行,當block任務執行完成後,其他隊列任務才恢複執行。(這裡還有個要特別注意的,就是系統在判別是否要暫停隊列的執行時,是按照block任務是否在隊列頭,如果不是就停止隊列執行)

上面例子1中建立一個新隊列,block任務在第一個,即隊列頭,以同步執行時就是所有在主線程執行的隊列會暫停執行(除了block任務所在隊列)。例子2因為是建立一個新隊列,又是非同步執行,所以會建立一個新線程執行,所以列印出來的0,也就是主線程上的隊列照常執行。

為了證明我上面的假設,我舉個例子:

3、

dispatch_queue_t queue = dispatch_get_main_queue();dispatch_sync(queue, ^{NSLog(@"%d",[[NSThread currentThread] isMainThread]);});

4、

dispatch_queue_t queue = dispatch_get_main_queue();dispatch_async(queue, ^{NSLog(@"%d",[[NSThread currentThread] isMainThread]);});

上面兩個例子都是將block任務添加到主隊列,但是結果卻不同,例子3結果是永遠不會執行列印語句,程式不會再執行了,例子4正常執行,且在主隊列中
結論:不是非同步就一定會開啟新的線程

例子3因為將block任務添加到主隊列中,此時主隊列已經有任務(當前語句沒有執行完,所以block任務不是將要執行的任務),根據前面的系統判定,主隊列被暫停執行,此時前面的任務無法完成,後面的block任務也無法完成,造成死迴圈
例子4中將任務添加到主隊列中,雖然是非同步作業,但是並不會開啟新的線程,因為在主隊列中,要在主線程中執行,而非同步作業不會將線程阻塞,所以隊列照常執行。

結論:同步會讓系統判定暫停執行所有不以block塊任務為第一任務的隊列(即如果block塊任務不在隊列頭,那麼block塊任務所在的隊列也會暫停執行),且同步一定不會開啟新線程,因為GCD覺得既然其它隊列暫停執行,block塊任務就可以在當前線程執行了,沒有必要開啟新線程。而非同步則系統不會進行判定,但是不一定會開啟新線程,這個跟隊列有關,如果是新建立的隊列,那麼GCD就會開啟新線程,如果加入已有的隊列,那麼就會在隊列所在的線程中執行。

簡單來講,同步操作那麼block塊任務會在當前線程中執行,比如上面在主線程中進行同步操作,那麼一定就是在主線程中執行,不管隊列是主隊列還是全域隊列或者自己建立的隊列。如果是非同步作業的話,那麼就要分情況來看了,如果是主隊列,那麼就是在主線程中執行,如果是全域或自己建立的隊列,那麼就是在新建立的線程中執行,全域隊列會根據任務自動建立一個或多個線程,自己建立的隊列就是根據參數設定和任務進行分配。


至於串列和並行,串列和並行是針對同一個隊列中的任務而言的,當使用串列,那麼隊列裡的那麼隊列裡的任務最多隻能使用一個線程運行,即同一時刻只有一個任務在執行,如果是並行,那麼系統會根據隊列裡的任務自動分配線程執行,最大線程數跟據參數設定

 

 

轉載請註明:作者SmithJackyson

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.