什么?异步并发的子线程也会阻塞其他线程?
哈哈异步子线程是不会阻塞主线程的,但是有可能会影响其他线程 这个是比较坑的地方 比如你开了线程异步后 发现除主线程外都不执行了 什么原因?
请看下面例子
首先创建一个线程
- (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];
}
});
这个问题告诉我们不是所有的方法都要封装 还是要根据实际情况来定 不过这种情况比较少见!!!
网友评论