美文网首页
GCD-同步、异步、串行、并行的组合执行情况

GCD-同步、异步、串行、并行的组合执行情况

作者: 一双鱼jn | 来源:发表于2018-05-26 12:47 被阅读30次
  • 同步 : 1 等待该任务执行完毕之后再继续向下执行。 2 不开启新的线程,在原来的线程执行。

  • 异步 : 将该任务提交到队列。继续向下执行。不等待任务执行完毕。可以开启新的线程来执行任务,由系统来调度

  • 串行队列 :只会有一条线程来执行这个队列的任务。

  • 并发队列 :可以将队列里的任务逐个交给多个线程去同时执行。

    既然是队列,任务就会按顺序被取出来然后由线程去执行。

    并发队列是可以将任务1取出来交给线程1去执行,然后将任务2取出来交给线程2去执行。这样可以多个线程同时执行多个任务。达到并发的效果。当然这需要任务是异步执行的,否则会等待第一个任务执行完之后再执行。

    而串行队列是只能取出来一个任务交给一个线程执行,等这个线程执行完了这个任务再取一个任务交给这个线程去执行。不会有多个线程来取这个队列的任务。同步则是在当前线程执行,异步则是开一条新的线程来执行。


同步操作在各队列下的情况

dispatch_sync(queue,block)

同步 + 主队列 = 死锁

- (void)viewDidLoad {
    [super viewDidLoad];

    dispatch_sync(dispatch_get_main_queue(), ^{
        // do something
    });
}
同步主队列

同步 + 串行队列

- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        // do somethings
    });
}

执行到这里,主线程将该任务提交到串行队列中

由于是同步方法,所以主线程会等待这个任务执行完毕再向下执行。

并且因为是同步方法,所以这个任务不会开新的线程来执行,还是由原来的线程执行。

也就是说主线程等这个串行队列中前面的任务执行完毕之后,执行这个任务。执行了这个任务之后向下继续执行。

这种操作没有太大的必要。

图示

同步串行队列

同步 + 并发队列

- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        // do somethings
    });
}

相比于同步串行队列,该任务等待时间会短一点,因为是并发队列,前面的任务会被其他线程去执行。其他的基本相同

图示

同步并发队列执行

异步操作在各队列下的情况

dispatch_async(queue,block)

异步 + 主队列

- (void)viewDidLoad {
    [super viewDidLoad];

    dispatch_async(dispatch_get_main_queue(), ^{
        // do something
    });
}

将任务添加到主队列的最后。

图示

异步主队列执行图

异步 + 串行队列

将任务提交到指定的串行队列。

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        // do something
    });
}

因为是异步的,所以主线程将任务提交到这个串行队列之后就可以继续执行。不会卡住主线程。

同样因为是异步的,所以会开启一条子线程来执行这个串行队列中的任务。

因为是串行队列,所以只有一条线程来执行这个队列中的任务。那么该任务就得等前面的任务被该线程执行完了才能被执行。

图示

异步串行队列图示

异步 + 并发队列

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // do something
    });
}

将任务提交到并发队列,因为是异步的,所以不会阻塞主线程,主线程将任务提交到队列之后继续从向下执行。

因为是在并发队列,所以该任务不用等前面的任务完成之后再执行,只要前面的任务被线程开始执行了,接下来就会将该任务分配给一条线程去执行。

异步并行队列图示

相关文章

  • GCD-同步、异步、串行、并行的组合执行情况

    同步 : 1 等待该任务执行完毕之后再继续向下执行。 2 不开启新的线程,在原来的线程执行。 异步 : 将该任务提...

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

    线程、任务和队列的概念 异步、同步 & 并行、串行的特点 组合 |并行队列|串行队列 |主队列----|----|...

  • iOS多线程小结

    同步异步串行并行 同步串行:不开启线程 同步并行:不开启线程 异步串行:最多开启一个线程 异步并行:开启线程 同步...

  • 多线程GCD的使用

    一、同步/异步、串行/并行的区别 1.同步/异步 同步/异步是指线程与线程之间的关系。 2.串行/并行 串行、并行...

  • 串行队列和并行队列的区别体现

    网络上很多文章都写了多线程的4种组合同步+串行 , 异步+串行 , 同步+并行 ,异步+并行在同一条线程中使用,不...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • GCD 小结

    一、 同步/异步、串行/并行的区别 1.同步/异步 同步/异步是指线程与线程之间的关系. 2.串行/并行 串行/并...

  • sync 和 async区别

    同步,异步,串行,并行

  • GCD

    同步、异步、串行、并行的概念 同步/异步:指的是能否开启新的线程,同步不能开启新的线程,异步可以。串行/并行:指的...

  • GCD 相关函数

    串行同步 串行异步 并行同步 并行异步 主队列同步 会死锁 主队列异步 异步处理耗时,回主线程刷新UI 栅栏函数 ...

网友评论

      本文标题:GCD-同步、异步、串行、并行的组合执行情况

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