开发者社区> 社会主义> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

GCD之线程挂起与恢复

简介:
+关注继续查看

我们可以使用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先输出。




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
线程管理(十)线程组
声明:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:方腾飞 线程组 Java并发 API里有个有趣的方法是把线程分组。
1422 0
关于用strace工具定位vrrpd进程有时会挂死的bug
只做工作总结备忘之用。 正在烧镜像,稍总结一下进来改bug遇到的问题。     一个项目里要用到L3 switch的nat,vrrp功能,但实地测试中偶然出现write file挂死的情况,但不是必现。
1330 0
SQL远程恢复
原文:SQL远程恢复 -- ============================================= -- Author: dcrenl -- Create date: 2013-9-5 14:08:35 -- Description: WEB服务器远程恢复数据库,远程恢复和远程备份的思路是一样的。
700 0
线程、进程 的创建
线程、进程 的创建 创建线程。 创建进程。 该程序效果见下。
545 0
+关注
社会主义
从.Net到iOS,在撸的道路上越走越远,工作之余经营着博客园http://www.cnblogs.com/5ishare,欢迎小伙伴(妹子更好)一起交流,谈谈人生理想。作为经常从网上索取免费资料的一员,要有回报回报的思想,也让更多的人少走弯路.
237
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载