多线程-GCD并发队列

同样通过两个方法,分别来演示并发队列与同步执行和异步执行任务的区别:

  • 示例代码:
#pragma mark -- 并行队列与同步、异步的组合
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    // 同步执行
    // [self concurrentSync];
    // 异步执行
    [self concurrentAsync];
}

#pragma mark -- 并行同步
- (void)concurrentSync{
    
    // 同步
    
    // 1.创建并行队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    // 2.创建任务
    dispatch_block_t taskBlock1 = ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"Task1-->%@",[NSThread currentThread]);
    };
    dispatch_block_t taskBlock2 = ^{
        NSLog(@"Task2-->%@",[NSThread currentThread]);
    };
    
    // 同步执行
    dispatch_sync(concurrentQueue, taskBlock1);
    dispatch_sync(concurrentQueue, taskBlock2);
    
    // 结论: 在当前的线程执行(同步不具备开启新线程能力),任务依次执行
}
#pragma mark -- 并行异步
- (void)concurrentAsync{
    
    // 异步
    
    // 1.创建并行队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    // 2.创建任务
    dispatch_block_t taskBlock1 = ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"Task1-->%@",[NSThread currentThread]);
    };
    dispatch_block_t taskBlock2 = ^{
        NSLog(@"Task2-->%@",[NSThread currentThread]);
    };
    
    // 异步执行(每添加一个任务就开启一条线程)
    dispatch_async(concurrentQueue, taskBlock1);
    dispatch_async(concurrentQueue, taskBlock2);
    
    // 结论: 开启线程执行任务(根据任务开启多条线程),任务并行处理(没有按照添加到队列中的顺序来执行)
}

@end

虽然先将task1添加到队列中,但是手动进行了延迟处理,因为并发队列和异步处理共同决定开启了多条线程,虽然task1先从队列中取出执行,但task2任务耗费时间相对较短,CPU在随机调度后,task2先被执行完毕

  • 结论:
    1.并行队列,异步执行
开多个线程,异步执行
每次开启多少个线程是不固定的(线程数,不由我们控制),线程数是由GCD来决定的(线程池)

2.并行队列,同步执行

不开线程,顺序执行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容