美文网首页
GCD子线程异步阻塞的坑

GCD子线程异步阻塞的坑

作者: 繁华乱世沧桑了谁的容颜 | 来源:发表于2020-07-03 15:44 被阅读0次

    什么?异步并发的子线程也会阻塞其他线程?

    哈哈异步子线程是不会阻塞主线程的,但是有可能会影响其他线程 这个是比较坑的地方 比如你开了线程异步后 发现除主线程外都不执行了 什么原因?
    请看下面例子

    首先创建一个线程

    - (dispatch_queue_t)saveInfoQue
    {
        if (!_saveInfoQue)
        {
          _saveInfoQue = dispatch_queue_create("com.saveInf.que", DISPATCH_QUEUE_CONCURRENT);
        }
        return _saveInfoQue;
    }
    

    例子1: 场景比如做一下耗时操作 比如写入数据库 需要查询 删除写入操作 这时候你封装方法保存用了dispatch_async 但是当你使用这句代码的时候 可能是一个数组for循环保存 这时候效果就类似于下面的效果

    for (int i = 0; i < 5000; i ++)
      {
        dispatch_async(self.saveInfoQue, ^{
            [NSThread sleepForTimeInterval:2];
        });
      }
    

    这个时候如果你的界面有请求网络的操作 你会发现网络不再请求了 这时候下意识的以为是AF线程被阻塞了, 这时候你查看线程会发现 com.saveInf.que这个线程已经被创建了上百个 超过了CPU支持的最大数量 , 那么你另外的AF请求就没办法执行了 因为CPU不能开启更多的线程 导致网络请求创建一直处于等待状态,其效果类似于阻塞。

    这个时候我们应该怎么办呢?

    使用下面这个方法就可以避免线程过多而导致的类似于阻塞现象

    dispatch_async(self.saveInfoQue, ^{
        
        for (int i = 0; i < 5000; i ++)
          {
            [NSThread sleepForTimeInterval:2];
          }
    });
    

    这个问题告诉我们不是所有的方法都要封装 还是要根据实际情况来定 不过这种情况比较少见!!!

    相关文章

      网友评论

          本文标题:GCD子线程异步阻塞的坑

          本文链接:https://www.haomeiwen.com/subject/kamsqktx.html