iOS串行队列与线程关系勘误
2019-04-14 本文已影响11人
迷路的安然和无恙
前言
为了减少错误观点对他人的影响,我会把平时遇到的有些作者不严谨的博客技术点或者观点在这里进行勘误。
今天要说的是串行队列和异步执行的一个误解。
原作者博客地址
原作者介绍了线程和队列的关系,并且得出如下结论:
串行: 任务以FIFO从序列中一个一个执行。一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)而且只会开启一条线程。
首先这是个错误观点,或者说非常不严谨。
作者的for循环,创建的线程内部任务并不耗时,并且线程使用完后并不会立即就被销毁,如果在被销毁之前又有新的任务,那就会继续执行任务,所以作者因此认为,串行队列只开启一条线程,这里会让许多人误认为,串行队列只可能在一条线程上执行。
其实多个线程是可以执行同一个串行队列中的任务的,如下示例:
dispatch_queue_t serialQueue = dispatch_queue_create("q_queue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
sleep(3);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
NSLog(@"1");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
sleep(1);
NSLog(@"2");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"3");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
sleep(5);
NSLog(@"4");
NSLog(@"%@", [NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"5");
NSLog(@"%@", [NSThread currentThread]);
});
结果可以看出:
有线程3和线程4执行了串行队列中的任务。
image.png