GCD 串行队列和并行队列以及dispatch_group

并行队列同时会开很多线程,(测试用了11个任务,结果显示11个任务同时执行了),可以使用信号量来控制线程数量,函数concurrentQueueTest中,最多同时运行三个任务;

串行队列,执行完一个任务才会执行下一个任务,如果有两个串行队列,则两个串行队列可以并发执行, 见serialQueueTest函数以及其输出

如果某些任务需要更另一些任务完成后才执行,可以使用dispatch_group_t,见groupQueueTest以及其输出;


-(void) serialQueueTest

{

    //获取concurrent queue

    dispatch_queue_t aQueue = dispatch_queue_create("shunxun",DISPATCH_QUEUE_SERIAL);

    //任务1

    dispatch_async(aQueue, ^{

        NSLog(@"task 1 begin.");

        

        NSLog(@"task 1 end.");

        

    });

    //任务2

    dispatch_async(aQueue, ^{

        NSLog(@"task 2 begin.");

        

        NSLog(@"task 2 end.");

    });

    //任务3

    dispatch_async(aQueue, ^{

        NSLog(@"task 3 begin.");

        

        NSLog(@"task 3 end.");

    });

    

    dispatch_release(aQueue);

//另一个串行队列

    dispatch_queue_t aQueue2 = dispatch_queue_create("shunxun",DISPATCH_QUEUE_SERIAL);

    //任务4

    dispatch_async(aQueue2, ^{

        NSLog(@"task 4 begin.");

        

        NSLog(@"task 4 end.");

        

    });

    //任务5

    dispatch_async(aQueue2, ^{

        NSLog(@"task 5 begin.");

        

        NSLog(@"task 5 end.");

    });

    //任务6

    dispatch_async(aQueue2, ^{

        NSLog(@"task 6 begin.");

        

        NSLog(@"task 6 end.");

    });

    

    dispatch_release(aQueue2);

}

输出:

2015-05-07 11:59:06.588 XXXXX[1554:62042] task 1 begin.

2015-05-07 11:59:06.588 XXXXX[1554:62377] task 4 begin.

2015-05-07 11:59:06.588 XXXXX[1554:62042] task 1 end.

2015-05-07 11:59:06.588 XXXXX[1554:62377] task 4 end.

2015-05-07 11:59:06.588 XXXXX[1554:62042] task 2 begin.

2015-05-07 11:59:06.589 XXXXX[1554:62042] task 2 end.

2015-05-07 11:59:06.589 XXXXX[1554:62377] task 5 begin.

2015-05-07 11:59:06.589 XXXXX[1554:62042] task 3 begin.

2015-05-07 11:59:06.589 XXXXX[1554:62042] task 3 end.

2015-05-07 11:59:06.589 XXXXX[1554:62377] task 5 end.

2015-05-07 11:59:06.589 XXXXX[1554:62377] task 6 begin.

2015-05-07 11:59:06.589 XXXXX[1554:62377] task 6 end.



-(void) groupQueueTest

{

    //获取concurrent queue

    //dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_queue_t aQueue = dispatch_queue_create("shunxun",DISPATCH_QUEUE_SERIAL);

    //创建1个queue group

    dispatch_group_t queueGroup = dispatch_group_create();

    //任务1

    dispatch_group_async(queueGroup, aQueue, ^{

        NSLog(@"task 1 begin.");

        

        NSLog(@"task 1 end.");

        

    });

    //任务2

    dispatch_group_async(queueGroup, aQueue, ^{

        NSLog(@"task 2 begin.");

        

        NSLog(@"task 2 end.");

    });

    //任务3

    dispatch_group_async(queueGroup, aQueue, ^{

        NSLog(@"task 3 begin.");

        

        NSLog(@"task 3 end.");

    });

    NSLog(@"wait task 1,2,3.");

    //等待组内任务全部完成

    dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);

    NSLog(@"task 1,2,3 finished.");

    //释放组

    dispatch_release(queueGroup);

    //重新创建组

    queueGroup = dispatch_group_create();

    //任务4

    dispatch_group_async(queueGroup, aQueue, ^{

        NSLog(@"task 4 begin.");

        

        NSLog(@"task 4 end.");

    });

    //任务5

    dispatch_group_async(queueGroup, aQueue, ^{

        NSLog(@"task 5 begin.");

        

        NSLog(@"task 5 end.");

    });

    //任务6

    dispatch_group_async(queueGroup, aQueue, ^{

        NSLog(@"task 6 begin.");

        

        NSLog(@"task 6 end.");

    });

    NSLog(@"wait task 4,5,6.");

    //等待组内任务全部完成

    dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);

    NSLog(@"task 4,5,6 finished.");

    //释放组

    dispatch_release(queueGroup);

}

输出:

2015-05-07 11:48:34.479 XXXXX[1492:56691] wait task 1,2,3.

2015-05-07 11:48:34.479 XXXXX[1492:56788] task 2 begin.

2015-05-07 11:48:34.479 XXXXX[1492:56763] task 3 begin.

2015-05-07 11:48:34.479 XXXXX[1492:56768] task 1 begin.

2015-05-07 11:48:34.480 XXXXX[1492:56788] task 2 end.

2015-05-07 11:48:34.480 XXXXX[1492:56763] task 3 end.

2015-05-07 11:48:34.480 XXXXX[1492:56768] task 1 end.

2015-05-07 11:48:34.480 XXXXX[1492:56691] task 1,2,3 finished.

2015-05-07 11:48:34.480 XXXXX[1492:56691] wait task 4,5,6.

2015-05-07 11:48:34.480 XXXXX[1492:56788] task 5 begin.

2015-05-07 11:48:34.480 XXXXX[1492:56768] task 4 begin.

2015-05-07 11:48:34.480 XXXXX[1492:56763] task 6 begin.

2015-05-07 11:48:34.480 XXXXX[1492:56788] task 5 end.

2015-05-07 11:48:34.480 XXXXX[1492:56763] task 6 end.

2015-05-07 11:48:34.480 XXXXX[1492:56768] task 4 end.

2015-05-07 11:48:34.480 XXXXX[1492:56691] task 4,5,6 finished.


如果将上述队列更换为串行队列,则输出为:

2015-05-07 11:51:47.101 XXXXX[1518:58789] wait task 1,2,3.

2015-05-07 11:51:47.101 XXXXX[1518:58836] task 1 begin.

2015-05-07 11:51:47.101 XXXXX[1518:58836] task 1 end.

2015-05-07 11:51:47.101 XXXXX[1518:58836] task 2 begin.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 2 end.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 3 begin.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 3 end.

2015-05-07 11:51:47.102 XXXXX[1518:58789] task 1,2,3 finished.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 4 begin.

2015-05-07 11:51:47.102 XXXXX[1518:58789] wait task 4,5,6.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 4 end.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 5 begin.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 5 end.

2015-05-07 11:51:47.102 XXXXX[1518:58836] task 6 begin.

2015-05-07 11:51:47.103 XXXXX[1518:58836] task 6 end.

2015-05-07 11:51:47.103 XXXXX[1518:58789] task 4,5,6 finished.




-(void) concurrentQueueTest

{

    dispatch_semaphore_t fd_sema = dispatch_semaphore_create(4);

    

    //获取concurrent queue

    dispatch_queue_t aQueue = dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    //任务1

    dispatch_async(aQueue, ^{

        NSLog(@"task 1 begin.");

        

        sleep(10);

        NSLog(@"task 1 end.");

        dispatch_semaphore_signal(fd_sema);

        

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    //任务2

    dispatch_async(aQueue, ^{

        NSLog(@"task 2 begin.");

        

        sleep(9);

        NSLog(@"task 2 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    //任务3

    dispatch_async(aQueue, ^{

        NSLog(@"task 3 begin.");

        sleep(8);

        NSLog(@"task 3 end.");

        dispatch_semaphore_signal(fd_sema);

    });


    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    //任务4

    dispatch_async(aQueue, ^{

        NSLog(@"task 4 begin.");

        sleep(7);

        NSLog(@"task 4 end.");

        dispatch_semaphore_signal(fd_sema);

        

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    //任务5

    dispatch_async(aQueue, ^{

        NSLog(@"task 5 begin.");

        sleep(6);

        NSLog(@"task 5 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    //任务6

    dispatch_async(aQueue, ^{

        NSLog(@"task 6 begin.");

        sleep(5);

        NSLog(@"task 6 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    dispatch_async(aQueue, ^{

        NSLog(@"task 7 begin.");

        sleep(4);

        NSLog(@"task 7 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    dispatch_async(aQueue, ^{

        NSLog(@"task 8 begin.");

        sleep(3);

        NSLog(@"task 8 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    dispatch_async(aQueue, ^{

        NSLog(@"task 9 begin.");

        sleep(2);

        NSLog(@"task 9 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    dispatch_async(aQueue, ^{

        NSLog(@"task 10 begin.");

        sleep(1);

        NSLog(@"task 10 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    

    dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

    

    dispatch_async(aQueue, ^{

        NSLog(@"task 11 begin.");

        

        NSLog(@"task 11 end.");

        dispatch_semaphore_signal(fd_sema);

    });

    dispatch_release(aQueue);

}

输出:

2015-05-07 12:07:29.853 XXXXX[1625:67663] task 1 begin.

2015-05-07 12:07:29.853 XXXXX[1625:67812] task 3 begin.

2015-05-07 12:07:29.853 XXXXX[1625:67811] task 2 begin.

2015-05-07 12:07:29.853 XXXXX[1625:67813] task 4 begin.

2015-05-07 12:07:36.853 XXXXX[1625:67813] task 4 end.

2015-05-07 12:07:36.853 XXXXX[1625:67815] task 5 begin.

2015-05-07 12:07:37.853 XXXXX[1625:67812] task 3 end.

2015-05-07 12:07:37.854 XXXXX[1625:67813] task 6 begin.

2015-05-07 12:07:38.853 XXXXX[1625:67811] task 2 end.

2015-05-07 12:07:38.854 XXXXX[1625:67812] task 7 begin.

2015-05-07 12:07:39.853 XXXXX[1625:67663] task 1 end.

2015-05-07 12:07:39.854 XXXXX[1625:67663] task 8 begin.

2015-05-07 12:07:42.853 XXXXX[1625:67815] task 5 end.

2015-05-07 12:07:42.854 XXXXX[1625:67812] task 7 end.

2015-05-07 12:07:42.854 XXXXX[1625:67813] task 6 end.

2015-05-07 12:07:42.854 XXXXX[1625:67815] task 9 begin.

2015-05-07 12:07:42.854 XXXXX[1625:67813] task 10 begin.

2015-05-07 12:07:42.854 XXXXX[1625:67812] task 11 begin.

2015-05-07 12:07:42.854 XXXXX[1625:67812] task 11 end.

2015-05-07 12:07:42.854 XXXXX[1625:67663] task 8 end.

2015-05-07 12:07:43.855 XXXXX[1625:67813] task 10 end.

2015-05-07 12:07:44.854 XXXXX[1625:67815] task 9 end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值