并行队列同时会开很多线程,(测试用了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.