論-多線程之全局隊列(並行隊列)與主隊列(串行隊列)




#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self GCDDemo4];

}


//==========================================

//GCD的兩個核心,隊列和任務
//1.創建隊列,(獲取隊列)
//2.將任務添加到隊列中

//根據隊列的性質分為並行隊列(全局隊列),和串行隊列(主隊列)
//並行和串行只會決定添加到隊列中的任務是串行執行還是並行執行!


//根據任務的執行順序分同步和異步
//同步和異步只會決定要不要等當前定制的任務執行完畢之后在執行之后的代碼

//串行隊列(主隊列),同步執行  ----死鎖
//根據同步的特點來看
//先執行任務1,在執行任務2,最后執行任務3
//根據串行隊列的特點來看
//先執行任務1,再執行任務3,最后執行任務2

//主隊列--必須要主線程中的任務執行完畢,才會執行主隊列中的任務
//執行的順序  任務1 任務3  任務2

//dispatch_sync
//執行順序  任務1 - 任務2 - 任務3
-(void)GCDDemo1{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任務1-%@",[NSThread currentThread]);
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"任務2%@",[NSThread currentThread]);
        });
        NSLog(@"任務---3%@",[NSThread currentThread]);
    });
    NSLog(@"任務4--%@",[NSThread currentThread]);
}

dispatch_async(dispatch_get_global_queue(0, 0)任務加到全局隊列異步執行,開啟子線程,任務4主線程,任務1子線程,這兩個執行順序誰先誰后都有可能(因為是異步執行),4的執行概率高一些.dispatch_sync(dispatch_get_main_queue()任務加到主隊列,同步執行,不開啟子線程,只能任務2執行完畢再往下執行任務3,任務1與任務4多試幾次就知道他倆的執行順序不固定



//並行隊列(全局隊列),同步執行
//先執行任務1,在執行任務2,最后執行任務3
//串行隊列(主隊列),同步執行,沒有開啟新的線程
-(void)GCDDemo2{
    NSLog(@"任務1-%@",[NSThread currentThread]);
    for (int i = 0; i < 1000; i++) {
        dispatch_sync(dispatch_get_global_queue(0, 0), ^{
//            for (int i = 0; i < 1000; i ++) {
                NSLog(@"任務2%@",[NSThread currentThread]);
//            }
        });
    }
    NSLog(@"任務3--%@",[NSThread currentThread]);
}

  • 主線程任務1先執行,dispatch_sync(dispatch_get_global_queue(0, 0)同步執行不開啟新線程代碼順序執行,不論是加入了主隊列還是全局隊列中,都要順序執行,所以任務2執行完畢才會輪到任務3


//串行隊列(主隊列),異步執行
//根據串行隊列的特點:
//任務的執行順序應該是,先執行任務1,在執行任務3,最后執行任務2 ---
//因為是異步,那么任務2有沒有可能會在任務3之前執行呢?
//???如果對於隊列的執行順序有疑問的話,我們將任務2添加1000次,最后看看是否任務2可能在任務3的前面
//通過1000次的循環來看,任務2一定在任務3的后面執行
//這個是為什么呢,因為將任務添加到的隊列是主隊列,主隊列是一個串行隊列,串行隊列的特點是按照順序執行,所以任務2就一定被添加到任務3的前面!

//串行隊列(主隊列),異步執行,沒有開啟新的線程
//主隊列--必須要主線程中的任務執行完畢,才會執行主隊列中的任務
-(void)GCDDemo3{
    NSLog(@"任務1-%@",[NSThread currentThread]);
//    for (int i = 0; i < 1000; i++) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"任務2--%@",[NSThread currentThread]);
        });
//    }
    NSLog(@"任務3--%@",[NSThread currentThread]);
    
}

  • 任務1主線程,先執行. dispatch_async(dispatch_get_main_queue(),任務2放到主隊列;異步執行,由於主隊列是串行隊列,主隊列的任務要等主線程的任務3執行完畢后才可以執行.則執行順序為132


//並行隊列(全局隊列),異步執行
//任務的執行順序是 任務1,任務3和任務2是並發執行的

-(void)GCDDemo4{
    NSLog(@"任務1-%@",[NSThread currentThread]);
    for (int i = 0; i < 1000; i++) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"任務2%@",[NSThread currentThread]);
        });
    }

    NSLog(@"任務3%@",[NSThread currentThread]);
    
}

@end


  • 任務1在主線程,先執行,dispatch_async(dispatch_get_global_queue(0, 0)任務2加入並發隊列,異步執行,則會開啟子線程,則任務3與任務2並發執行.

小結:

  • 主隊列的任務要等主線程的任務執行完畢后才可以執行.
  • 不管是在全局隊列還是主隊列中同步執行則都會按照代碼順序依次上到下執行
  • 在主隊列異步執行也是按照代碼順序依次從上到下執行.主隊列是串行隊列,同步執行依然如此.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM