美文网首页
iOS串行队列、并行队列进行同步或者异步任务解析

iOS串行队列、并行队列进行同步或者异步任务解析

作者: aron1992 | 来源:发表于2017-12-09 21:03 被阅读169次

IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情况的工作方式。

同步任务,使用GCD dispatch_sync 进行派发任务

- (void)testSync {
    dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_CONCURRENT);

    NSLog(@"====serialQueue====");
    for (int i = 0; i<10; i++) {
        dispatch_sync(serialQueue, ^{
            [NSThread  sleepForTimeInterval:0.3];
            NSLog(@"==>%@  sync serial XXX>%d", [NSThread currentThread], i);
        });
    }
    
    NSLog(@"====concurrentQueue====");
    for (int i = 0; i<10; i++) {
        dispatch_sync(concurrentQueue, ^{
            [NSThread  sleepForTimeInterval:0.3];
            NSLog(@"==>%@  sync concurrent ====>%d", [NSThread currentThread], i*i);
        });
    }
}

结果如下:

2017-03-01 01:36:22.835 Demo ====serialQueue====
2017-03-01 01:36:23.207 {number = 1, name = main}  sync serial XXX>0
2017-03-01 01:36:23.578 {number = 1, name = main}  sync serial XXX>1
2017-03-01 01:36:23.952 {number = 1, name = main}  sync serial XXX>2
2017-03-01 01:36:24.325 {number = 1, name = main}  sync serial XXX>3
2017-03-01 01:36:24.699 {number = 1, name = main}  sync serial XXX>4
2017-03-01 01:36:25.072 {number = 1, name = main}  sync serial XXX>5
2017-03-01 01:36:25.446 {number = 1, name = main}  sync serial XXX>6
2017-03-01 01:36:25.746 {number = 1, name = main}  sync serial XXX>7
2017-03-01 01:36:26.122 {number = 1, name = main}  sync serial XXX>8
2017-03-01 01:36:26.489 {number = 1, name = main}  sync serial XXX>9
2017-03-01 01:36:26.489 Demo ====concurrentQueue====
2017-03-01 01:36:26.864 {number = 1, name = main}  sync concurrent ====>0
2017-03-01 01:36:27.236 {number = 1, name = main}  sync concurrent ====>1
2017-03-01 01:36:27.611 {number = 1, name = main}  sync concurrent ====>4
2017-03-01 01:36:27.985 {number = 1, name = main}  sync concurrent ====>9
2017-03-01 01:36:28.354 {number = 1, name = main}  sync concurrent ====>16
2017-03-01 01:36:28.726 {number = 1, name = main}  sync concurrent ====>25
2017-03-01 01:36:29.100 {number = 1, name = main}  sync concurrent ====>36
2017-03-01 01:36:29.474 {number = 1, name = main}  sync concurrent ====>49
2017-03-01 01:36:29.849 {number = 1, name = main}  sync concurrent ====>64
2017-03-01 01:36:30.223 {number = 1, name = main}  sync concurrent ====>81

testSync方法是在主线程中调用的,结果看到使用的串行队列和使用并行队列看到的结果都是发生在当前线程:主线程中,没有开启新的线程处理任务,任务的调度也是串行调度的。

异步任务,使用GCD dispatch_async 进行派发任务

- (void)testAsync {
    dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_CONCURRENT);
    
    NSLog(@"====serialQueue====");
    for (int i = 0; i<10; i++) {
        dispatch_async(serialQueue, ^{
            [NSThread sleepForTimeInterval:0.3];
            NSLog(@"==>%@  async serial XXX>%d", [NSThread currentThread], i);
        });
    }
    
    NSLog(@"====concurrentQueue====");
    for (int i = 0; i<10; i++) {
        dispatch_async(concurrentQueue, ^{
            [NSThread  sleepForTimeInterval:0.3];
            NSLog(@"==>%@  async concurrent ====>%d", [NSThread currentThread], i*i);
        });
    }
}

结果如下:

2017-03-01 01:45:36.125 Demo ====serialQueue====
2017-03-01 01:45:36.125 Demo ====concurrentQueue====
2017-03-01 01:45:36.494 {number = 3, name = (null)}  async concurrent ====>0
2017-03-01 01:45:36.494 {number = 5, name = (null)}  async concurrent ====>4
2017-03-01 01:45:36.494 {number = 4, name = (null)}  async concurrent ====>1
2017-03-01 01:45:36.494 {number = 6, name = (null)}  async concurrent ====>16
2017-03-01 01:45:36.494 {number = 8, name = (null)}  async serial XXX>0
2017-03-01 01:45:36.494 {number = 7, name = (null)}  async concurrent ====>9
2017-03-01 01:45:36.494 {number = 9, name = (null)}  async concurrent ====>25
2017-03-01 01:45:36.494 {number = 11, name = (null)}  async concurrent ====>49
2017-03-01 01:45:36.494 {number = 10, name = (null)}  async concurrent ====>36
2017-03-01 01:45:36.501 {number = 13, name = (null)}  async concurrent ====>81
2017-03-01 01:45:36.501 {number = 12, name = (null)}  async concurrent ====>64
2017-03-01 01:45:36.869 {number = 8, name = (null)}  async serial XXX>1
2017-03-01 01:45:37.244 {number = 8, name = (null)}  async serial XXX>2
2017-03-01 01:45:37.615 {number = 8, name = (null)}  async serial XXX>3
2017-03-01 01:45:37.986 {number = 8, name = (null)}  async serial XXX>4
2017-03-01 01:45:38.358 {number = 8, name = (null)}  async serial XXX>5
2017-03-01 01:45:38.730 {number = 8, name = (null)}  async serial XXX>6
2017-03-01 01:45:39.103 {number = 8, name = (null)}  async serial XXX>7
2017-03-01 01:45:39.472 {number = 8, name = (null)}  async serial XXX>8
2017-03-01 01:45:39.842 {number = 8, name = (null)}  async serial XXX>9

testSync方法是在主线程中调用的,结果看到使用的串行队列的异步任务会开启一个子线程执行任务,任务的调度是串行的
使用并行队列的异步任务会开启多个子线程并行的处理任务,任务的先后顺序是不固定的,任务的调度方式是并行的

总结

同步任务:和使用的队列无关,不会开启子线程处理任务,会在当前的线程中串行的调度任务,即一个任务完成之后继续下一个任务,如果同步任务在主线程中调用,会阻塞主线程
异步任务:a. 使用串行队列,会开启一个子线程串行的调度任务 b. 使用并行队列,会开启多个子线程并行的调度任务,这种情况用的是最多的。

相关文章

  • GCD基础总结一

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

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

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

  • GCD

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

  • iOSIN-GCD

    队列和同步异步 区别并行队列串行队列主队列同步(sync)没有开启新线程,串行执行任务没有开启新线程,串行执行任务...

  • IOS多线程总结

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

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

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

  • iOS GCD随记(一)任务/队列组合

    1.同步执行+串行队列2.同步执行+并行队列3.异步执行+串行队列4.异步执行+并行队列5.同步执行+主队列6.异...

  • iOS串行队列、并行队列进行同步或者异步任务解析

    IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情...

  • iOS多线程同步异步、串行并发的个人剖析(GCD)

    先来说一个队列和任务: 队列分为串行和并行 任务的执行分为同步和异步 这两两组合就成为了串行队列同步执行,串行队列...

  • iOS多线程同步异步、串行并发的剖析

    先来说一个队列和任务: 队列分为串行和并行 任务的执行分为同步和异步 这两两组合就成为了串行队列同步执行,串行队列...

网友评论

      本文标题:iOS串行队列、并行队列进行同步或者异步任务解析

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