GCD中dispatch_suspend/dispatch_resume使用方法

在GCD中dispatch_suspend和dispatch_resume提供了“挂起、恢复”队列的功能,简单来说,就是可以暂停、恢复队列上的任务。但是这里的“挂起”,并不能保证可以立即停止队列上正在运行的block,未执行的block会被“挂起”。

dispatch_suspend(queue) //暂停某个队列  dispatch_suspend挂起指定的dispatch_queue
dispatch_resume(queue)  //恢复某个队列  dispatch_resume恢复指定的dispatch_queue
/*
dispatch_suspend会挂起dispatch queue,但并不意味着当前正在执行的任务会停下来,这只会导致不再继续执行还未执行的任务。
dispatch_resume会唤醒已挂起的dispatch queue。你必须确保它们成对调用。
*/

代码执行

    dispatch_queue_t queue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);
    //提交第一个block,延时5秒打印。
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"五秒后打印,队列挂起时已经开始执行,");
    });
    //提交第二个block,也是延时5秒打印
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"队列挂起时未执行,需恢复队列后在执行");
    });
    //延时一秒
    NSLog(@"立刻打印~~~~~~~");
    [NSThread sleepForTimeInterval:1];
    //挂起队列
    NSLog(@"一秒后打印,队列挂起");
    dispatch_suspend(queue);
    //延时10秒
    [NSThread sleepForTimeInterval:10];
    NSLog(@"十秒后打印,开启队列");
    //恢复队列
    dispatch_resume(queue);
打印结果:
2017-05-04 16:22:57.279 Practice_Animation[2234:1740974] 立刻打印~~~~~~~
2017-05-04 16:22:58.281 Practice_Animation[2234:1740974] 一秒后打印,队列挂起
2017-05-04 16:23:02.284 Practice_Animation[2234:1742180] 五秒后打印,队列挂起时已经开始执行,
2017-05-04 16:23:08.283 Practice_Animation[2234:1740974] 十秒后打印,开启队列
2017-05-04 16:23:13.288 Practice_Animation[2234:1742717] 队列挂起时未执行,需恢复队列后在执行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS应用程序中,如果不做特殊的操作,程序的代码都是跑在主线程中的。在主线程中有一个RunLoop, iOS会在...
    勿与龙比阅读 792评论 0 9
  • 程序中同步和异步是什么意思?有什么区别? 解释一:异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调...
    风继续吹0阅读 1,062评论 1 2
  • 一. 重点: 1.dispatch_queue_create(生成Dispatch Queue) 2.Main D...
    BestJoker阅读 1,606评论 2 2
  • 一、多线程简介: 所谓多线程是指一个 进程 -- process(可以理解为系统中正在运行的一个应用程序)中可以开...
    寻形觅影阅读 1,119评论 0 6
  • 今天吹完蜡烛,儿子问我妈妈你许了什么愿望。我笑着回答:平安,合家幸福。很多时候是当自我感觉良好了才会兴致勃勃的总结...
    莫里夫人0505阅读 194评论 0 0