GCD使用 并行串行队列同步异步执行组合状况

一、异步函数和并行队列并发

注意:这些任务都是在建立完以后才执行。异步函数+并发队列,能够新建线程,各线程也是并发执行的。异步

 1 //第一种:系统方法建立并发队列(全局队列)
 2     /**
 3      *  <#Description#>
 4      *
 5      *  @param identifier#> 优先级(有四个) description#>
 6      *  @param flags#>      系统保留关键字,暂时写0 description#>
 7      *
 8      *  @return <#return value description#>
 9      */
10     dispatch_queue_t queueSys = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
11     
12     //第二种:本身方法建立
13     dispatch_queue_t queueO = dispatch_queue_create("queueO", DISPATCH_QUEUE_CONCURRENT);
//并发 + 异步  number = 3, name = (null) 也就是说异步开启子线程
    dispatch_async(queueSys, ^{
        NSLog(@"并发 + 异步 %@",[NSThread currentThread]);
    });

二、同步函数+并发队列async

注意:这些任务都是建立一个就立马执行,执行完才建立下一个,由于是同步函数,因此不新建线程,只要是同步函数,就不会新建线程。并发队列与否,并不影响同步函数的建立,由于自己就不能多建立线程,也就不存在并发ide

//并发 + 同步
    dispatch_sync(queueSys, ^{
        NSLog(@"并发 + 同步 %@",[NSThread currentThread]);
    });

三、异步函数+串行队列函数

注意:这个搭配能够新建线程,可是由于是串行队列,因此实际上也只是开了一条新线程,作完一个,再作另外一个。spa

 1 //第一种:系统提供的串行队列方式(串行队列中比较实用,经常使用在开发中)
注意:由于主队列是串行队列,并且是主线程执行的,只要加到主队列就必定是加载主线程,不管是同步仍是异步
2 dispatch_queue_t queue = dispatch_get_main_queue();//主队列 3 4 //第二种: 5 dispatch_queue_t queue1 = dispatch_queue_create("queue", 0); 6 7 //将任务添加到队列当中 8 //串行队列 + 异步任务:只开一个子线程 9 dispatch_async(queue1, ^{ 10 NSLog(@"串行 + 异步 %@",[NSThread currentThread]); 11 }); 12 13 /** 14 * 线程锁死 15 * 缘由1:dispatch_sync在等待任务执行完成,可是任务又被添加到主线程里,因此在主线程里执行,因此dispatch_syn在主线程中调用,就会形成锁死 16 dispatch_queue_t queue = dispatch_get_main_queue();//主队列 17 dispatch_sync(queue1, ^{ 18 NSLog(@"串行 + 同步 %@",[NSThread currentThread]); 19 }); 20 * 缘由2:dispatch_sync是同步的,自己就会阻塞线程,就是主线程,往如今又网主线程里添加任务,就会发生锁死,因此不用系统自带主队列建立,用create

嵌套也会卡死

        

//串行队列 + 同步任务:
    dispatch_sync(queue1, ^{
       //串行队列 + 同步任务:
        dispatch_sync(queue1, ^{
            NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
        });
        NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
    });

 

21      *  @return <#return value description#>
22      */

四、同步函数+串行线程

注意:这样既不会开新线程,也是串行执行的code

//串行队列 + 同步任务:
    dispatch_sync(queue1, ^{
        NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
    });
相关文章
相关标签/搜索