今天来测试一下GCD的串行和并行队列
我一直很好奇对于dispatch_sync方法,对于这两种队列会发生什么
于是开始测试,先测试串行队列
dispatch_queue_t Cqueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
dispatch_sync(Cqueue, ^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@"1完毕:%@", [NSThread currentThread]);
});
dispatch_sync(Cqueue, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"2完毕:%@", [NSThread currentThread]);
});
dispatch_sync(Cqueue, ^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@"3完毕:%@", [NSThread currentThread]);
});
结果如下
同步串行队列
很明显我们可以看到,没有开辟新的线程,直接在主线程干活
那么同步并行队列呢?
dispatch_queue_t Cqueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(Cqueue, ^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@"1完毕:%@", [NSThread currentThread]);
});
dispatch_sync(Cqueue, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"2完毕:%@", [NSThread currentThread]);
});
dispatch_sync(Cqueue, ^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@"3完毕:%@", [NSThread currentThread]);
});
dispatch_sync并行队列
可以得到和串行队列一样的结果,所以我们可以得出结论:
结论:只要是dispatch_sync这种方式,不管是串行和并行队列都不会开辟新的线程,在当前线程中按任务顺序执行。
那么对于dispatch_async这种方式呢,我们来测试一下:
dispatch_queue_t queue1 = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue1, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"s1完毕:%@", [NSThread currentThread]);
});
dispatch_async(queue1, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"s2完毕:%@", [NSThread currentThread]);
});
dispatch_async(queue1, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"s3完毕:%@", [NSThread currentThread]);
});
结果:
dispatch_async并行队列测试结果
我们可以看到dispatch_async对于并行队列的调度,对于每一个任务都会开辟一个新的线程并行。
对于串行队列呢?我们来看下
dispatch_queue_t queue1 = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue1, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"s1完毕:%@", [NSThread currentThread]);
});
dispatch_async(queue1, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"s2完毕:%@", [NSThread currentThread]);
});
dispatch_async(queue1, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"s3完毕:%@", [NSThread currentThread]);
});
结果:
dispatch_async对于串行的结果
可以很明显的看到对于所有任务只开辟了一条新的线程,异步于主线程来串行执行任务。
网友评论