zoukankan      html  css  js  c++  java
  • GCD之线程挂起与恢复

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

    下面看代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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);

     运行结果:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
      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先输出。

  • 相关阅读:
    继承
    反射
    DOS使用笔记
    [LeetCode] Merge Intervals
    [LeetCode] Insert Interval
    [LeetCode] Permutation Sequence
    [LeetCode] Rotate List
    [LeetCode] Text Justification
    [LeetCode] Simplify Path(可以不用看)
    [LeetCode] Edit Distance(很好的DP)
  • 原文地址:https://www.cnblogs.com/yulei126/p/6783213.html
Copyright © 2011-2022 走看看