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_queueglobalQueue同步了优先级,但是它的两个任务task1 task1-2还是在同一个线程里以serial串行方式执行的。
请看下图日志:

queue日志.png

祭出demo
更新日期 2018-08-28

上一篇下一篇

猜你喜欢

热点阅读