示例

dispatch_queue_t serial_queue = dispatch_queue_create(“串行队列”, DISPATCH_QUEUE_SERIAL);
dispatch_queue_t concurrent_queue = dispatch_queue_create(“串行队列”, DISPATCH_QUEUE_CONCURRENT);
NSLog(@“serial_queue == %@”, serial_queue);
NSLog(@“concurrent_queue == %@”, concurrent_queue);

NSLog(@“1”);
[self getCurrentThread];

// 同步 x 串行
// 1. 主队列 => 死锁
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@“同步 x 串行 - block”);
});

// 2. 普通串行队列
dispatch_sync(serial_queue, ^{
NSLog(@“2”);
[self getCurrentThread];// main
});

// 同步 x 并行
dispatch_sync(serial_queue, ^{
NSLog(@“3”);
[self getCurrentThread];// main
});
// 结论:主线程中,任务放到其他队列(并行、串行均可)同步执行,会顺序执行,执行完放入的任务,再继续向下执行主队列的任务,不会死锁。

// 异步 x 串行
// 1. 主队列
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@“4”);// 在6后输出
[self getCurrentThread];// main(main_queue只能派发到主线程?)
});
// 2. 普通串行队列
dispatch_async(serial_queue, ^{
NSLog(@“5”);
[self getCurrentThread]; // (null)
});

// 异步 x 并行
dispatch_async(concurrent_queue, ^{
NSLog(@“6”);// 在7后输出
[self getCurrentThread]; // (null)
});
NSLog(@“7”);

// 1 2 3 7 5
// 6 4

总结

同步、异步

同步和异步是站在当前线程的角度,考察添加任务到新线程后,何时返回到当前线程执行下面的代码的问题,也即新添加的线程阻不阻塞当前线程。