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

本文共 980 字,大约阅读时间需要 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://njrhx.baihongyu.com/

你可能感兴趣的文章
csv文件的操作
查看>>
快排序算法
查看>>
坑爹的Mysql
查看>>
每天进步一点点-->函数fseek() 使用方法
查看>>
Unity Editor类常用方法
查看>>
Code Review中的几个提示
查看>>
AUC(Area Under roc Curve)学习笔记
查看>>
Flash和js交互的效率分析
查看>>
Linux高性能server编程——Linux网络基础API及应用
查看>>
office编程必不可少
查看>>
SQL —— 视图
查看>>
百分比,千分比,万分比,百分比或百分吕,千分率等
查看>>
[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件
查看>>
类似微信发图片的样式
查看>>
ios+oc面试题
查看>>
linux+nginx+tomcat负载均衡,实现session同步
查看>>
用Asp.net实现简单的文字水印
查看>>
[Javascript] Function scope
查看>>
Nginx 变量漫谈(八)
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>