同步sync 異步async

線程中ios

同步任務是串行隊列,也就是按順序執行。程序員

同步任務:不會開闢新的線程,它是在當前線程執行的。網絡

dispatch 調度   GCD裏面的函數都是以dispatch開頭的。併發

同步任務  步驟:異步

1.建立一個串行隊列    參數:1.隊列標籤   2.隊列屬性   DISPATCH_QUEUE_SERIAL它是個宏,是個NULLasync

dispatch_queue_t queue = dispatch_queue_create("ZPqueue",DISPATCH_QUEUE_SERIAL);函數

2.同步執行任務  通常只要使用同步執行,串行隊列對添加的同步任務,就會立刻執行。性能

dispatch_sync(queue,^{NSLog(@"%@",[NSThread currentThread]);});網站

 

異步執行:確定會開新線程,並且只會開一個線程,全部任務都會在這個新的線程裏面執行。spa

異步任務 步驟:

dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_SERIAL);

2.同步執行任務  通常只要使用同步執行,串行隊列對添加的同步任務,就會立刻執行。

dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});

 

併發隊列:會開多個線程,而且它要開多少個線程是咱們沒法控制的。

dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_CONCURRENT);

2.同步執行任務  通常只要使用同步執行,串行隊列對添加的同步任務,就會立刻執行。

dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});

 

 

總結:

核心概念:

任務:block

隊列:把任務放到隊列裏面,隊列遵循先進先出原則。

串行隊列:按順序執行,當前任務執行完畢纔會執行下一個目標任務。

併發隊列:同時執行多個任務(能夠同時去除多個任務,只要有線程)。

 

串行隊列同步執行:不開線程,在原來的線程裏面一個一個的按順序執行。

串行隊列異步執行:開一條線程,在新的線程裏面按順序執行。

併發隊列異步執行:開多個線程,併發執行(不必定是一個一個的執行,可能會是多個一塊兒執行)。

併發隊列同步執行:不開線程,在原來的線程裏面一個一個按順序執行。

 

階段性總結:

1.開不開線程,由執行任務方法決定,同步不開線程,異步確定開線程。

2.開多少線程,由隊列決定,串行最多開一個線程,併發能夠開多個線程。具體開多少個由GCD底層決定,程序員不能控制。

 

**主隊列**

// 主隊列  :專門負責在主線程上調度任務,不會再子線程調度任務,在主隊列不容許開新線程

// 主隊列:不容許開新線程

// 異步執行:會開新線程,在新線程執行。

// 結果:不卡線程,只能在主線程上面運行,順序執行。

步驟:

得到主隊列   --- 程序一旦啓動至少有一個主線程--->一開始就會建立主隊列

-(void)test1{

   // 1.得到主隊列 

  dispatch_queue_t queue = dispatch_get_main_queue();

  // 2.異步執行任務

    for(int i = 0; i < 10; i++)

    {

     NSLog(@"調度前-----");

     // 異步:把任務放到主隊列裏,可是不須要立刻執行。它跟for循環沒有關係,test1執行完畢以後他會所有執行完成。

      dispatch_async(queue,^{

           NSLog(@"%@ %d",[NSThread currnetThread],i);

         });

     }

     NSLog(@"完成---");  // 在這裏執行完畢以後會執行主隊列的東西。

}

注意:異步執行:異步任務不須要立刻執行,只是先把任務放到主隊列,等線程有空再去執行,就是等到test1執行結束了,主線程有空閒了就去執行

**同步任務**

-(void)test2{

   // 1.得到主隊列 

  dispatch_queue_t queue = dispatch_get_main_queue();

  // 2.異步執行任務

    for(int i = 0; i < 10; i++)

    {

     NSLog(@"調度前-----");

     // 異步:把任務放到主隊列裏,可是不須要立刻執行。它跟for循環沒有關係,test1執行完畢以後他會所有執行完成。

      dispatch_sync(queue,^{

           NSLog(@"%@ %d",[NSThread currnetThread],i);

         });

     }

     NSLog(@"完成---");  // 在這裏執行完畢以後會執行主隊列的東西。

}

注意:這個任務是執行不下去的,由於同步任務須要立刻執行,可是主線程上面正在執行test2,因此須要等待test2執行完畢以後才能執行同步任務,可是test2在等待這個同步任務執行結束,這樣就形成主線程阻塞,產生死鎖。誰也沒有辦法往下執行。

 

併發隊列:

-(void)test3

{

  // 例子:有一個小說網站,必須登錄才能下載小說

  // 分析:上面是有三個任務---1,用戶登陸 2,下載小說a  3,下載小說b  

     // 因此這個小說網站是經過同步執行。

  dispatch_queue_t queue = dispatch_queue_create("cz",DISPATCH_QUEUE_CONCURRENT);

  dispatch_sync(queue,^{

    NSLog(@"用戶登陸%@",[NSThread currentThread]);

  }); 

}

**全局隊列**

/**

全局隊列跟併發隊列的區別

1.全局隊列:沒有名稱,併發隊列有名稱 

2.全局隊列,是供全部的應用程序共享

3.再mrc開發,併發隊列建立完成,須要釋放;全局隊列不須要管理。

*/

-(void)test4

{

  // 獲取全局隊列

  // DISPATCH_QUEUE_PRIORITY_HIGH 2 高級優先級  IOS7.0

  // DISPATCH_QUEUE_PRIORITY_DEFAULT 0  默認優先級 IOS7.0

  // DISPATCH_QUEUE_PRIORITY_LOW (-2) 低優先級 IOS7.0

  // DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 後臺優先級  IOS7.0

  // IOS8.0 QOS_CLASS_DEFAULT 0 ;

     // 參數:1.優先級 (通常寫 0  能夠適配ios7盒ios8)2.預留參數(也是直接寫0)

  dispatch_queue_t  queue = dispatch_get_global_queue  queue(0,0);

  // 添加異步任務

      dispatch_async(queue,^{

    NSLog(@"用戶登陸%@",[NSThread currentThread]);

  }); 

}

****************************************************************** 

**      *  全局並行隊列    * 手動建立串行隊列   *  主隊列      *

****************************************************************** 

**同步並行  *   沒有開啓新線程    * 沒有開啓新線程    *  死鎖         *

      *     串行執行任務       * 串行執行任務                *

**異步    *   有開啓新線程     * 有開啓新線程     *  沒有開啓新線程  *

      *     並行執行任務     * 串行執行任務     *  串行執行任務     *

****************************************************************** 

 

 

隊列的選擇:

串行隊列異步執行

--開一條線程,順序執行。

--效率不高,執行的比較慢,資源佔用小->省電

使用場合:

通常網絡鏈接(3g 4g)對性能要求不會很高

併發隊列異步執行

--開啓多條線程,併發執行

--效率高,執行快。資源佔用大->費電。

使用場合:

-網絡wifi   或者須要很快響應,要求用戶體驗很是流暢。

-對任務執行順序沒有要求

同步任務:通常只會在併發隊列,須要阻塞後續任務,必須等待同步任務執行完畢,再去執行其餘任務。「依賴」關係。

 

從子線程回到主線程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

  // 執行耗時的異步操做。。。。

  dispatch_async(dispatch_get_main_queue(),^{

   // 回到主線程

  });

});

相關文章
相關標籤/搜索