我自己开始也有疑惑,那就是为什么dispatch_sync 总是在主线程执行。下面串行和并行队列都是打印出主线程。
并行队列
dispatch_queue_t concurrentQueue= dispatch_queue_create("串行队列", DISPATCH_QUEUE_CONCURRENT); dispatch_sync(concurrentQueue, ^{ NSLog(@"任务执行中333%@",[NSThread currentThread]); });
串行队列
dispatch_queue_t serialQueue= dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL); dispatch_sync(serialQueue, ^{ NSLog(@"任务执行中222%@",[NSThread currentThread]); });
Barrier[14137:166266] 任务执行中333<NSThread: 0x600003f22240>{number = 1, name = main} 2019-02-14 11:40:20.997570+0800 Barrier[14137:166266] 任务执行中222<NSThread: 0x600003f22240>{number = 1, name = main}
总结如下
dispatch_sync:同步任务无论在自定义串行队列、自定义并行队列、主队列(当前线程为主线程时会出现死锁)、全局队列 执行任务时,都不会创建子线程,而是在当前线程中串行执行;
dispatch_async:异步任务无论在自定义串行队列、自定义并行队列(主队列除外,主队列下,任务会在主线中串行执行)、全局队列 执行任务时,都会创建子线程,并且在子线程中执行;