文档章节

GCD中的dispatch_set_target_queue的用法及作用

xiaobai1315
 xiaobai1315
发布于 2017/04/26 13:31
字数 830
阅读 17
收藏 0

 

(一),使用dispatch_set_target_queue更改Dispatch Queue的执行优先级

dispatch_queue_create函数生成的DisPatch Queue不管是Serial DisPatch Queue还是Concurrent Dispatch Queue,执行的优先级都与默认优先级的Global Dispatch queue相同,如果需要变更生成的Dispatch Queue的执行优先级则需要使用dispatch_set_target_queue函数

复制代码

1 - (void)testTeagerQueue1 {
2     dispatch_queue_t serialQueue = dispatch_queue_create("com.oukavip.www",NULL);
3     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
4     
5     dispatch_set_target_queue(serialQueue, globalQueue);
6     // 第一个参数为要设置优先级的queue,第二个参数是参照物,既将第一个queue的优先级和第二个queue的优先级设置一样。
7 }

复制代码

(二),使用dispatch_set_target_queue修改用户队列的目标队列,使多个serial queue在目标queue上一次只有一个执行

首先,我们需要阐述一下生成多个Serial DisPatch Queue时的注意事项

Serial DisPatch Queue是一个串行队列,只能同时执行1个追加处理(即任务),当用Dispatch_queue_create函数生成多个Serial DisPatch Queue时,每个Serial DisPatch Queue均获得一个线程,即多个Serial DisPatch Queue可并发执行,同时处理添加到各个Serial DisPatch Queue中的任务,但要注意如果过多地使用多线程,就会消耗大量内存,引起大量的上下文切换,大幅度降低系统的响应性能,所以我们只在为了避免多个线程更新相同资源导致数据竞争时,使用Serial DisPatch Queue

 第一种情况:使用dispatch_set_target_queue(Dispatch Queue1, Dispatch Queue2)实现队列的动态调度管理

复制代码

1 - (void)testTargetQueue2 {
 2     //创建一个串行队列queue1
 3     dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL);
 4     //创建一个串行队列queue2
 5     dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL);
 6     
 7     //使用dispatch_set_target_queue()实现队列的动态调度管理
 8     dispatch_set_target_queue(queue1, queue2);
 9     
10     
11 /*
12  
13     <*>dispatch_set_target_queue(Dispatch Queue1, Dispatch Queue2);
14     那么dispatchA上还未运行的block会在dispatchB上运行。这时如果暂停dispatchA运行:
15     
16     <*>dispatch_suspend(dispatchA);
17     这时则只会暂停dispatchA上原来的block的执行,dispatchB的block则不受影响。而如果暂停dispatchB的运行,则会暂停dispatchA的运行。
18     
19     这里只简单举个例子,说明dispatch队列运行的灵活性,在实际应用中你会逐步发掘出它的潜力。
20     
21     dispatch队列不支持cancel(取消),没有实现dispatch_cancel()函数,不像NSOperationQueue,不得不说这是个小小的缺憾
22      
23 */
24     dispatch_async(queue1, ^{
25         for (NSInteger i = 0; i < 10; i++) {
26             NSLog(@"queue1:%@, %ld", [NSThread currentThread], i);
27             [NSThread sleepForTimeInterval:0.5];
28             if (i == 5) {
29                 dispatch_suspend(queue2);
30             }
31         }
32     });
33     
34     dispatch_async(queue1, ^{
35         for (NSInteger i = 0; i < 100; i++) {
36             NSLog(@"queue1:%@, %ld", [NSThread currentThread], i);
37         }
38         
39     });
40     
41     dispatch_async(queue2, ^{
42         for (NSInteger i = 0; i < 100; i++) {
43             NSLog(@"queue2:%@, %ld", [NSThread currentThread], i);
44         }
45     });
46     
47 }

复制代码

第二种情况:使用dispatch_set_target_queue将多个串行的queue指定到了同一目标,那么着多个串行queue在目标queue上就是同步执行的,不再是并行执行。

复制代码

- (void)testTargetQueue {
    //1.创建目标队列
    dispatch_queue_t targetQueue = dispatch_queue_create("test.target.queue", DISPATCH_QUEUE_SERIAL);
    
    //2.创建3个串行队列
    dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue3 = dispatch_queue_create("test.3", DISPATCH_QUEUE_SERIAL);
    
    //3.将3个串行队列分别添加到目标队列
    dispatch_set_target_queue(queue1, targetQueue);
    dispatch_set_target_queue(queue2, targetQueue);
    dispatch_set_target_queue(queue3, targetQueue);
    
    
    dispatch_async(queue1, ^{
        NSLog(@"1 in");
        [NSThread sleepForTimeInterval:3.f];
        NSLog(@"1 out");
    });
    
    dispatch_async(queue2, ^{
        NSLog(@"2 in");
        [NSThread sleepForTimeInterval:2.f];
        NSLog(@"2 out");
    });
    dispatch_async(queue3, ^{
        NSLog(@"3 in");
        [NSThread sleepForTimeInterval:1.f];
        NSLog(@"3 out");
    });
}

本文转载自:http://www.cnblogs.com/denz/archive/2016/02/24/5214297.html

共有 人打赏支持
上一篇: NSThread基本用法
下一篇: KVO默认关闭 
xiaobai1315
粉丝 3
博文 205
码字总数 65949
作品 0
程序员
私信 提问
iOS中几种常见的定时器的使用

前言 iOS开发中定时器经常会用到,常用的定时器有三种,分别是NSTime,CADisplayLink和GCD。 一、NSTimer 方式1 // 创建定时器 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2...

han笑笑
2016/11/03
4
0
漫谈多线程:GCD(一)

导言 多线程是程序开发中非常基础的一个概念,大家在开发过程中应该或多或少用过相关的东西。同时这恰恰又是一个比较棘手的概念,一切跟多线程挂钩的东西都会变得复杂。如果使用过程中对多线...

Chars-D
2016/03/03
81
0
SDK源码解读系列:《iOS与OSX多线程和内存管理》书摘之GCD内部实现(一)

Dispatch Queue Dispatch Queue 对于我们开发者来说应该是非常熟悉了,运用的场景非常之多,但是他的内部是如何实现的呢? 用于管理追加的Block的C语言层实现的FIFO队列 Atomic函数中实现的用...

长平狐
2013/09/17
1K
0
GCD使用经验与技巧浅谈

前言 GCD(Grand Central Dispatch)可以说是Mac、iOS开发中的一大“利器”,本文就总结一些有关使用GCD的经验与技巧。 dispatchoncet必须是全局或static变量 这一条算是“老生常谈”了,但我认...

Snaiper
2015/10/21
61
0
GCD定时器

GCD定时器 1.1.GCD定时器基本应用 2.1.加强版GCD

AppleDream
2016/08/02
24
0

没有更多内容

加载失败,请刷新页面

加载更多

第二个JAVA应用

第二个JAVA应用 方法一:配置文件: # cd /usr/local/tomcat/conf/# vim server.xml</Host> <Host name="www.wangzb.cc" appBase="/data/wwwroot/www.wangzb.cc" //引用所......

wzb88
36分钟前
0
0
2019年阿里Java面试必问:JVM与性能优化+Redis+设计模式+分布式

前言 一年之计在于春 金三银四已经要到来,2019的新的开始,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对...

火力全開
45分钟前
8
0
详解:Redis主从技术的应用

Redis复制 在生产环境中,Redis通过持久化功能(RDB和AOF技术)保证了即使在服务器重启的情况下也不会损失(或少量损失)数据。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘...

问题终结者
50分钟前
0
0
RocketMQ高性能之底层存储设计

说在前面 RocketMQ在底层存储上借鉴了Kafka,但是也有它独到的设计,本文主要关注深刻影响着RocketMQ性能的底层文件存储结构,中间会穿插一点点Kafka的东西以作为对比。 例子 Commit Log,一...

薛定谔的旺
今天
4
0
实战:基于Spring Boot快速开发RESTful风格API接口

写在前面的话 这篇文章计划是在过年期间完成的,示例代码都写好了,结果亲戚来我家做客,文章没来得及写。已经很久没有更新文章了,小伙伴们,有没有想我啊。言归正传,下面开始,今天的话题...

JAVA_冯文议
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部