iOS多线程-dispatch_set_target_queue
2018-08-28 本文已影响13人
rainbowboy
祭出demo
在GCD
里,我们通过dispatch_get_global_queue
可以设置这个全局并发队列的优先级,但是通过dispatch_queue_create
是无法设置队列的优先级的。怎么办呢?
dispatch_set_target_queue(queue1, queue2)
就可以把queue1
的优先级修改为queue2
的优先级,这样就解决了,自行创建的队列无法设置优先级的问题。
看下示例:
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue3 = dispatch_queue_create("queue3", DISPATCH_QUEUE_SERIAL);
/*queue3是自行创建的,默认优先级是globalqueue的默认优先级即:PRIORITY_DEFAULT*/
/*统一queue1和queue2的优先级到globalQueue*/
dispatch_set_target_queue(queue1, globalQueue);
dispatch_set_target_queue(queue2, globalQueue);
dispatch_async(queue2, ^{
NSInteger i = 0 ;
while (i < 10) {
I++;
NSLog(@"task2:%ld queue:%@",i,NSThread.currentThread);
}
});
dispatch_async(queue1, ^{
NSInteger i = 0 ;
while (i < 10) {
I++;
NSLog(@"task1:%ld queue:%@",i,NSThread.currentThread);
}
});
dispatch_async(queue1, ^{
NSInteger i = 0 ;
while (i < 10) {
I++;
NSLog(@"task1-2:%ld queue:%@",i,NSThread.currentThread);
}
});
dispatch_async(queue3, ^{
NSInteger i = 0 ;
while (i < 10) {
I++;
NSLog(@"task3:%ld queue:%@",i,NSThread.currentThread);
}
});
自行创建的queue
,默认优先级是globalqueue
的默认优先级即:DISPATCH_QUEUE_PRIORITY_DEFAULT
queue1
里的任务虽然通过dispatch_set_target_queue
跟globalQueue
同步了优先级,但是它的两个任务task1 task1-2
还是在同一个线程里以serial
串行方式执行的。
请看下图日志: