GCD 面試題

今天咱們講解幾道這兩天遇到的面試題--GCD編程的.題目很不錯,很考究關於GCD的基本概念和使用.html

對於基本的概念,本人博客已在前面講過,本篇主要以面試題來說解.你們可看一下本人關於GCD的基本講解 http://www.javashuo.com/article/p-qldrphhv-gy.html面試

GCD編程的核心就是dispatch隊列, dispatch block的執行都會最終放到某個隊列中執行.咱們直接以題目來說解:編程

【例1】GCD面試題1xcode

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testGCD];
}

- (void)testGCD {
    //並行隊列
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_async(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

講解異步

  1. 首先看建立隊列是並行隊列,無需等待;
  2. 首先打印出,而後看dispatch_async,將dispatch_async代碼段整個看作事物,對於並行隊列,並不會等待,而後繞過dispatch_async事物,執行下面的內容,執行完下面內容後再次執行該事物;
  3. 緊接着打印出 ,執行完打印5,再次會執行dispatch_async整個代碼段,看裏面的內容有打印出 ,還有一個dispatch_async,還有打印出 4
       NSLog(@"2"); dispatch_async(queue, ^{ NSLog(@"3"); }); NSLog(@"4");
  4. 又由於是dispatch_async,以及後面打印出 4 ,又是並行隊列,異步執行,因此會先執行打印 4
  5. 執行完打印出 4 後,就會執行 3

驗證結果截圖async

 

【例2】GCD面試題2spa

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testGCD];
}

- (void)testGCD {
    //串行隊列
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

講解:線程

  1. 首先是串行隊列,只能按順序執行
  2. 首先打印出 1 ,而後是dispatch_async會開啓線程,裏面的內容會慢些執行,執行下面的打印 5 
  3. 打印出 5,而後回到dispatch_async裏面,異步執行會開啓線程,發現裏面有NSLog(@「2」),dispatch_syncy是個同步執行,NSLog(@「4」),而後先打印出 2 
  4. 由於外面dispatch_async,打印出2 以後,開始走 NSLog(@「4」),而後再回到同步裏面NSLog(@「3」),而後咱們發現dispatch_syncy是個同步執行,也就是不執行完同步裏面的NSLog(@「3」),就不可能走NSLog(@「4」),因此說兩邊都在等着對方,形成了死鎖
  5. 在程序中會崩潰

驗證結果截圖3d

 【例3】GCD面試題3code

dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"哈哈哈 1");
    });
    dispatch_async(queue, ^{
        NSLog(@"哈哈哈 2");
    });
    dispatch_sync(queue, ^{
        NSLog(@"哈哈哈 3");
    });
//////////////////// NSLog(
@"哈哈哈 0"); dispatch_async(queue, ^{ NSLog(@"哈哈哈 7"); }); dispatch_async(queue, ^{ NSLog(@"哈哈哈 8"); }); dispatch_async(queue, ^{ NSLog(@"哈哈哈 9"); });

A 1230789   B 1237890  C 3120798  D 2137890  C 3012789

上面五種答案,哪個是對的?

講解:

  1. 首先是並行隊列 DISPATCH_QUEUE_CONCURRENT,能夠並行的執行任務
  2. 在哈哈哈 3中是同步執行,因此此後面的代碼在3沒有執行完以前是不可能執行的,而前面的哈哈哈 1 和哈哈哈 2都是異步,是能夠執行完的,可是當哈哈哈3執行完會緊接着執行 哈哈哈0,因此不可能出現7,8,9在0以前執行完
  3. 從上能夠判斷出 A  C  E 是可能出現的

將上面的代碼運行到xcode獲得以下:E答案

【例4】GCD面試題4

咱們將DISPATCH_QUEUE_CONCURRENT改成DISPATCH_QUEUE_SERIAL

由於將並行隊列改成串行隊列,全部任務循序漸進執行,因此結果以下(不加以講解)

 

【例5】GCD面試題5

- (void) testGCD{
    __block NSInteger a = 0;
    while (a < 100) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            a++;
            NSLog(@"%ld======%@", a, [NSThread currentThread]);
        });
    }
    NSLog(@"臥槽無情%ld", a);
}

講解:

  1. 首先不可能打印出0,由於有while循環,while不走完,是不可能走後面的.a = 0, 而後進入while循環, 由於是異步,因此就會開啓線程執行a ++ , 可能開出的線程狀態很差,因此a可能繼續爲0, ……
  2. 可是在某個時刻,可能線程64狀態返回,執行a++, 因此a = 1 ,……
  3. 因此a的最後值是大於等於100(>=100)

可能狀態還不錯,從上面看出結果爲100

 

拓展 下面有幾道一樣的相似GCD面試題目,結果給你們,你們本身體會

【例6】GCD面試題6

- (void) testGCD2 {
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

結果以下:

【例7】GCD面試題7

- (void) testGCD2 {
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_async(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

結果以下:

【例8】GCD面試題8

- (void) testGCD2 {
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_async(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

結果以下:

 

以上就是GCD的經典面試題,其實看了這幾道面試題,發現還都是GCD的基本內容,串行隊列,並行隊列,以及同步異步是否開啓線程的基本概念,但願經過本次講解,你們對GCD的認識會更上一層,謝謝!!!

相關文章
相關標籤/搜索