博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD之线程挂起与恢复
阅读量:7175 次
发布时间:2019-06-29

本文共 971 字,大约阅读时间需要 3 分钟。

我们可以使用dispatch_suspend函数暂停一个queue以阻止它执行block对象;使用dispatch_resume函数继续dispatch queue。调用dispatch_suspend会增加queue的引用计数,调用dispatch_resume则减少queue的引用计数。当引用计数大于0时,queue就保持挂起状态。因此你必须对应地调用suspend和resume函数。挂起和继续是异步的,而且只在执行block之间(比如在执行一个新的block之前或之后)生效。挂起一个queue不会导致正在执行的block停止。

下面看代码:

dispatch_queue_t queue=dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);   dispatch_suspend(queue);   dispatch_async(queue, ^{       dispatch_apply(5, queue, ^(size_t index) {           NSLog(@"%ld  1",index);       });   });   sleep(1);   NSLog(@"aa");   dispatch_resume(queue);

 运行结果:

如果把线程挂起恢复取消之后:

dispatch_queue_t queue=dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);//    dispatch_suspend(queue);    dispatch_async(queue, ^{        dispatch_apply(5, queue, ^(size_t index) {            NSLog(@"%ld  1",index);        });    });    NSLog(@"aa");//    dispatch_resume(queue);

 运行结果如下 :

可以看到:线程挂起时,添加到线程队列中的block并没执行,而且还将主线程休眠了1秒,取消线程挂起后才执行,而在第二个代码段中,没有使用线程挂起,可以看到并不会都是aa先输出。

转载地址:http://rlpzm.baihongyu.com/

你可能感兴趣的文章
SQL Server里的 ISNULL 与 NULLIF
查看>>
Linux Systemcall By INT 0x80、Llinux Kernel Debug Based On Sourcecode
查看>>
imageNamed 与 imageWithContentsOfFile的区别
查看>>
【Mysql 调用存储过程,输出参数的坑】
查看>>
LCS算法
查看>>
COM结构化存储中存储对象或者流对象的命名规则
查看>>
iOS开发基础知识--碎片26
查看>>
制作鼠标移动到div上面显示弹出框
查看>>
java既然存在gc线程,为什么还存在内存泄漏?
查看>>
Linux Vim
查看>>
UVA - 11987 Almost Union-Find[并查集 删除]
查看>>
使用css开启硬件加速提高网站性能
查看>>
CMakeLists.txt的写法
查看>>
Flask如何使用https?
查看>>
Linux命令之kill
查看>>
Asp.Net SignalR Hub类中的操作详解
查看>>
附上解决迅雷9及迅雷极速版任何资源下载任务出错、内容违规问题
查看>>
hadoop3: mkdir: cannot create directory `/usr/local/hadoop/bin/../logs’: Permission denied
查看>>
高阶函数与面向对象继承的比较
查看>>
群雄逐鹿的移动互联网时代【转载】
查看>>