串行队列、并行队列、同步、异步是gcd编程中四个非常重要的概念,它们的组合会产生多种不同的执行顺序,在本文,我主要通过代码来罗列一下所有的可能产生的结果,并根据执行结果总结一下gcd编程的一些特点。
(1)串行队列 异步任务
-(void)test{
dispatch_queue_t q = dispatch_queue_create("fs", DISPATCH_QUEUE_SERIAL);
NSLog(@"start--%@",[NSThread currentThread]);
for (int i=0; i<10; i++) {
dispatch_async(q, ^{
NSLog(@"async--%@",[NSThread currentThread]);
});
}
NSLog(@"end--%@",[NSThread currentThread]);
}
打印结果如下:
上面代码创建了一个串行队列,然后往串行队列中添加了10个异步任务,从打印结果可以看出:先在主线程中执行打印start—,然后将异步任务添加到串行队列中(只是添加,并没有立即执行),之后在主线程打印end—,最后才会从串行队列中依次取出一个任务,并在子线程中执行,因此异步任务打印是有序的。所以, 主线程会在执行完dispatch_async方法后,立即返回执行主线程后续相关操作,主线程任务执行完毕后,才会在子线程中依次执行异步任务。由于串行队列中的任务是依次取出来执行的,即前一个任务在子线程执行完毕后,才能取出后一个任务来执行,所以只需要创建一个子线程即可。
结论:串行队列 异步任务,会创建子线程,且只创建一个子线程,异步任务执行是有序的。
(2)串行队列 同步任务
-(void)test2{
dispatch_queue_t q = dispatch_queue_create("fs", DISPATCH_QUEUE_SERIAL);
NSLog(@"start--%@",[NSThread currentThread]);
for (int i=0; i<10; i++) {
dispatch_sync(q, ^{
NSLog(@"sync--%@---%d",[NSThread currentThread],i);
});
}
NSLog(@"end--%@",[NSThread currentThread]);
}
打印结果如下:
上面代码创建了一个串行队列,然后往串行队列中添加了10个同步任务,从打印结果可以看出:先在主线程中执行打印start—,然后在主线程依次打印同步任务,最后在主线程打印end—。所以,主线程在执行dispatch_sync方法后,并没有立刻返回,而是阻塞了当前线程,去等待dispatch_s