美文网首页
【iOS出租屋进阶】之多线程GCD详解

【iOS出租屋进阶】之多线程GCD详解

作者: 是小胖阿 | 来源:发表于2017-03-22 00:39 被阅读0次

线程、任务和队列的概念

类型 概念
线程 程序执行任务的最小调度单位
任务 在GCD中,任务就是block中要执行的代码块
队列 存放任务的一个数组

异步、同步 & 并行、串行的特点

名称 特点
异步执行 语句执行结束的顺序和语句执行开始的顺序不一定相同,具备有开启新线程的能力
同步执行 语句执行结束的顺序和语句执行开始的顺序相同,不具备开启新线程的能力
并行队列 队列中的任务同时执行
串行队列 队列中的任务按添加顺序执行(先进先出)

组合

|并行队列|串行队列 |主队列
----|----|----|----
异步执行| 开启多个线程,任务同时执行|开启一个新线程,任务按顺序执行|不开启新线程任务按顺序执行
同步执行|不开启新线程,任务按顺序执行|不开启新线程,任务按顺序执行|会因为任务互相等待,造成死锁

代码详解

异步执行+并行队列

- (void)testGCD {
    NSLog(@"1");
    dispatch_async(dispatch_get_global_queue(), ^{
        NSLog(@"2");
    })
   //[NSThread sleepForTimerInterval:5];
   NSLog(@"3");
}

屏蔽延时代码的执行结果是:1 3 2
打开延时代码的执行结果是:1 2 3
由此我们可以得知dispatch_async当中的任务在另一个线程中异步执行,由于我们无法得知在RunLoop中两个线程的执行顺序,所以结果可以是132和123

异步执行+串行队列

- (void)testGCD {
    NSLog(@"1");
    dispatch_async(dispatch_queue_create("testGCD", DISPATCH_QUEUE_SERIAL), ^{
       //[NSThread sleepForTimerInterval:5];
        NSLog(@"2");
    })
    dispatch_async(dispatch_queue_create("testGCD", DISPATCH_QUEUE_SERIAL), ^{
        NSLog(@"3");
    })

}

屏蔽延时代码的执行结果是:1 2 3
打开延时代码的执行结果是:1 2 3
由此我们可知dispatch_async当中的多任务在同一个线程中根据添加进队列的顺序同步执行

异步执行+主队列

- (void)testGCD {
    NSLog(@"1");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    })
   //[NSThread sleepForTimerInterval:5];
   NSLog(@"3");
}

屏蔽延时代码的执行结果是:1 3 2
打开延时代码的执行结果是:1 3 2
主队列的任务只能在主线程中执行,所以加进dispatch_async的任务会根据添加进主队列的顺序同步执行

同步执行+并行队列

- (void)testGCD {
    NSLog(@"1");
    dispatch_sync(dispatch_get_global_queue(), ^{
        NSLog(@"2");
    })
   //[NSThread sleepForTimerInterval:5];
   NSLog(@"3");
}

屏蔽延时代码的执行结果是:1 2 3
打开延时代码的执行结果是:1 2 3
由于dispatch_sync没有开启新线程的能力,所以所有任务按照添加顺序在主线程中按顺序同步执行

同步执行+串行队列

- (void)testGCD {
    NSLog(@"1");
    dispatch_sync(dispatch_queue_create("testGCD", DISPATCH_QUEUE_SERIAL), ^{
       //[NSThread sleepForTimerInterval:5];
        NSLog(@"2");
    })
    dispatch_sync(dispatch_queue_create("testGCD", DISPATCH_QUEUE_SERIAL), ^{
        NSLog(@"3");
    })

}

屏蔽延时代码的执行结果是:1 2 3
打开延时代码的执行结果是:1 2 3
原因同上,只要是没有开启新线程,在主线程中任务就得按照添加顺序执行

同步执行+主队列

- (void)testGCD {
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    })
   //[NSThread sleepForTimerInterval:5];
   NSLog(@"3");
}

屏蔽延时代码的执行结果是:死锁
打开延时代码的执行结果是:死锁
主队列的任务要按照添加顺序执行,即132,而同步执行是按照代码添加顺序执行,即123。所以2在等待3执行结束,3在等待2执行结束,结果就造成了死锁

相关文章

网友评论

      本文标题:【iOS出租屋进阶】之多线程GCD详解

      本文链接:https://www.haomeiwen.com/subject/silsnttx.html