美文网首页
GCD 串行队列并行队列和同步派发异步派发

GCD 串行队列并行队列和同步派发异步派发

作者: 你猜我猜不猜你猜我猜不猜 | 来源:发表于2018-08-20 23:10 被阅读0次

串行队列

异步派发

不会造成线程阻塞,但是会依次执行派发任务

    dispatch_queue_t serialQqueue = dispatch_queue_create("serialQqueue", DISPATCH_QUEUE_SERIAL);
    // 异步派发
    dispatch_async(serialQqueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 异步派发
    dispatch_async(serialQqueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png
同步派发

依次执行派发任务,会阻塞线程

    dispatch_queue_t serialQqueue = dispatch_queue_create("serialQqueue", DISPATCH_QUEUE_SERIAL);
    // 同步派发
    dispatch_sync(serialQqueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 同步派发
    dispatch_sync(serialQqueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png
先异步派发再同步派发

异步派发时不会造成线程阻塞,同步派发是线程会阻塞,但依次执行派发任务

    dispatch_queue_t serialQqueue = dispatch_queue_create("serialQqueue", DISPATCH_QUEUE_SERIAL);
    // 异步派发
    dispatch_async(serialQqueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 同步派发
    dispatch_sync(serialQqueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png
先同步派发再异步派发

同步派发时线程会阻塞,当执行完派发任务后继续往下执行,异步派发时不会造成线程阻塞

    dispatch_queue_t serialQqueue = dispatch_queue_create("serialQqueue", DISPATCH_QUEUE_SERIAL);
    // 同步派发
    dispatch_sync(serialQqueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 异步派发
    dispatch_async(serialQqueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png

并行队列

异步派发

一起执行,不会造成线程阻塞

    dispatch_queue_t concurrencyQueue = dispatch_queue_create("concurrencyQueue", DISPATCH_QUEUE_CONCURRENT);

    // 异步派发
    dispatch_async(concurrencyQueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 异步派发
    dispatch_async(concurrencyQueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png
同步派发

依次执行,会造成线程阻塞,等同于串行队列同步派发

    dispatch_queue_t concurrencyQueue = dispatch_queue_create("concurrencyQueue", DISPATCH_QUEUE_CONCURRENT);

    // 同步派发
    dispatch_sync(concurrencyQueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 同步派发
    dispatch_sync(concurrencyQueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png
先异步派发再同步派发

异步派发时线程不阻塞,派发的任务单独执行,不受线程阻塞影响,同步派发时线程阻塞

  dispatch_queue_t concurrencyQueue = dispatch_queue_create("concurrencyQueue", DISPATCH_QUEUE_CONCURRENT);

    // 异步派发
    dispatch_async(concurrencyQueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 同步派发
    dispatch_sync(concurrencyQueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png
先同步派发再异步派发

同步派发时线程阻塞,当派发的任务执行结束后继续往下执行,异步派发时执行派发操作后继续执行,异步派发的内容单独执行

  dispatch_queue_t concurrencyQueue = dispatch_queue_create("concurrencyQueue", DISPATCH_QUEUE_CONCURRENT);

    // 同步派发
    dispatch_sync(concurrencyQueue, ^{
        NSLog(@"---1");
        sleep(2);
        NSLog(@"1");

    });
    NSLog(@"-----");
    // 异步派发
    dispatch_async(concurrencyQueue, ^{
        NSLog(@"---2");
        sleep(1);
        NSLog(@"2");
    });
    NSLog(@"end");
image.png

相关文章

  • 我理解的GCD

    一、前期准备 GCD中有这么几个概念:同步派发sync、异步派发async、串行队列、并行队列。大家应该都听过这几...

  • GCD 中的同步、异步、串行、并行还傻傻分不清楚?

    刚接触 GCD 时,初识同步派发、异步派发、串行队列、并行队列,我们一定有些懵圈,这都是啥跟啥?没关系,现在让我们...

  • GCD 串行队列并行队列和同步派发异步派发

    串行队列 异步派发 不会造成线程阻塞,但是会依次执行派发任务 同步派发 依次执行派发任务,会阻塞线程 先异步派发再...

  • 关于多线程GCD 串行/并行、同步/异步

    一、GCD串行/并行队列创建 串行队列: 并行队列: 二、GCD串行/并行队列同步/异步执行 执行内容1: 执行结...

  • IOS多线程总结

    目录 简述 NSThread GCD操作与队列异步操作并行队列同步操作并行队列同步操作串行队列异步操作串行队列队列...

  • GCD&NSOperationQueue

    GCD队列规律 同步派发任务只能在当前线程执行 异步派发任务可以在其他线程执行 串行队列任务只能在一个线程中执行 ...

  • GCD基础总结一

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

  • GCD

    1、同步串行队列 2、同步并行队列 3、异步串行队列 4、异步并行队列 5、死锁 主线程中创建同步串行队列 主线程...

  • 多线程

    1、同步、异步、串行、并行、全局队列、主队列2、Thread、NSOperation、GCD3、锁

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

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

网友评论

      本文标题:GCD 串行队列并行队列和同步派发异步派发

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