【iOS面試系列-2】多線程中同步、非同步和串列、並行之間的邏輯關係(必考,必須掌握)

來源:互聯網
上載者:User

標籤:

一、同步、非同步和串列、並行

     任務串列執行就是每次只有一個任務被執行,任務並發執行就是在同一時間可以有多個任務被執行。

     一個同步函數只在完成了它預定的任務後才返回。一個非同步函數,剛好相反,會立即返回,預定的任務會完成但不會等它完成。因此,一個非同步函數不會阻塞當前線程去執行下一個函數。  (來源:http://www.cocoachina.com/industry/20140428/8248.html) 

  隊列分為串列和並行

  任務的執行分為同步和非同步

  -------  隊列只是負責任務的調度,而不負責任務的執行   ---------

  ------- 任務是線上程中執行的  ---------

  串列隊列:任務按照順序被調度,前一個任務不執行完畢,隊列不會調度

  並行隊列:只要有閒置線程,隊列就會調度當前任務,交給線程去執行,不需要考慮前面是都有任務在執行,只要有線程可以利用,隊列就會調度任務。

  同步執行:不會開啟新的線程,任務按順序執行

  非同步執行:會開啟新的線程,任務可以並發的執行

  (來源:http://www.cnblogs.com/KongPro/p/5193175.html)

  【註:兩人說的有矛盾,一個說隊列執行任務,一個說隊列不執行任務= =一個說同步非同步是返回的問題,一個說同步非同步是開不開線程的問題】   同步(sync)非同步(async) 的主要區別在於會不會阻塞當前線程,直到 Block 中的任務執行完畢!
  如果是 同步(sync) 操作,它會阻塞當前線程並等待 Block 中的任務執行完畢,然後當前線程才會繼續往下運行。
  如果是 非同步(async)操作,當前線程會直接往下執行,它不會阻塞當前線程。  (原文連結:http://www.jianshu.com/p/0b0d9b1f1f19)  【第三個人和第一個人的意思差不多】

二、隊列

  GCD 提供有 dispatch queues 來處理代碼塊,這些隊列管理你提供給 GCD 的任務並用 FIFO 順序執行這些任務。這就保證了第一個被添加到隊列裡的任務會是隊列中第一個開始的任務,而第二個被添加的任務將第二個開始,如此直到隊列的終點。

  1、串列隊列

    唯一能確保的事情是 GCD 一次只執行一個任務,並且按照我們添加到隊列的順序來執行。由於在串列隊列中不會有兩個任務並發運行。

  放到串列隊列的任務,GCD 會 FIFO(先進先出) 地取出來一個,執行一個,然後取下一個,這樣一個一個的執行。

  2、並發隊列

    在並發隊列中的任務能得到的保證是它們會按照被添加的順序開始執行,任務可能以任意順序完成,你不會知道何時開始運行下一個任務,或者任意時刻有多少 Block 在運行。再說一遍,這完全取決於 GCD 。

    放到並行隊列的任務,GCD 也會 FIFO的取出來,但不同的是,它取出來一個就會放到別的線程,然後再取出來一個又放到另一個的線程。這樣由於取的動作很快,忽略不計,看起來,所有的任務都是一起執行的。不過需要注意,GCD 會根據系統資源控制並行的數量,所以如果任務很多,它並不會讓所有任務同時執行。

    (來源:http://www.cocoachina.com/industry/20140428/8248.html)

  (原文連結:http://www.jianshu.com/p/0b0d9b1f1f19)

 

三、組合

  1. 串列隊列同步執行:綜合上面闡述的串列隊列的特點 --- 按順序執行,同步:不會開啟新的線程,則串列隊列同步執行只是按部就班的one by one執行。
  2. 串列隊列非同步執行:雖然隊列中存放的是非同步執行的任務,但是結合串列隊列的特點,前一個任務不執行完畢,隊列不會調度,所以串列隊列非同步執行也是one by one的執行
  1. 並行隊列同步執行:結合上面闡述的並行隊列的特點,和同步執行的特點,可以明確的分析出來,雖然並行隊列可以不需等待前一個任務執行完畢就可調度下一個任務,但是任務同步執行不會開啟新的線程,所以任務也是one by one的執行
  2. 並行隊列非同步執行:再上一條中說明了並行隊列的特點,而非同步執行是任務可以開啟新的線程,所以這中組合可以實現任務的並發,再實際開發中也是經常會用到的

  (來源:http://www.cnblogs.com/KongPro/p/5193175.html)

  【個人總結:串列、並行區別就是有任務在執行時能不能讓新的任務去執行

        同步、非同步區別是會不會阻塞當前線程

        串列同步:取出一個任務,阻塞當前線程,任務執行完畢,任務執行完畢,下一個任務

        串列非同步:取出一個任務,不阻塞當前線程,不等任務執行完成,任務執行完畢,下一個任務

        並行同步:取出來一個任務,阻塞當前線程,任務執行完畢,不等任務執行完畢,下一個任務

        並行非同步:取出來一個任務,不阻塞當前線程,不等任務執行完成,不等任務執行完成,下一個任務

  】

  【所以現在最大的問題是,如果只有一個線程去非同步執行一個並行隊列裡的任務,會是怎樣?感覺上來說,不開線程的話就是同步,一旦叫非同步就說明開了線程,所以把這三個人的總結起來才比較合理】

 

let queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL)  //建立串列隊列   NSLog("之前 - %@", NSThread.currentThread())    dispatch_async(queue, { () -> Void in      //非同步執行串列隊列-開了一個新的線程        NSLog("sync之前 - %@", NSThread.currentThread())        dispatch_sync(queue, { () -> Void in   //同步執行串列隊列-阻塞當前線程並等待上一個任務執行完畢(而上一個任務就是阻塞的這個)             NSLog("sync - %@", NSThread.currentThread())        })        NSLog("sync之後 - %@", NSThread.currentThread())   })  NSLog("之後 - %@", NSThread.currentThread())

  【部落格上找來的還是不放心,有時間在書上看到相關的我會再來更新】

【iOS面試系列-2】多線程中同步、非同步和串列、並行之間的邏輯關係(必考,必須掌握)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.