同步(dispatch_sync):
dispatch_sync(fcQueue, ^{ NSLog(@"1"); // 任务 1 }); NSLog(@"2"); // 任务 2dispatch_sync(fcQueue, ^{ NSLog(@"3"); // 任务 3 }); NSLog(@"4"); // 任务 4
输出:“1234”。
异步(dispatch_async):
dispatch_async(serialQueue, ^{ NSLog(@"1"); //任务 1 }); NSLog(@"2"); dispatch_async(serialQueue, ^{ NSLog(@"3"); //任务 3 }); NSLog(@"4");
上面代码执行结果可能为 “1234”、“1243”、“2134”、“2143”、“2413”中的一种,2 始终在 4 前面,1 始终在 3 前面,2 始终在 3 前面。
死锁
NSLog(@"1"); // 任务1dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); // 任务2});NSLog(@"3"); // 任务3
输出: 1。
如图所示,代码中dispatch_sync(dispatch_get_main_queue(), ^{ });会获取主线程(当前线程)阻塞之,执行完任务1就不会继续走任务2,它会把任务2放到任务3后面,等到任务2执行完才会打通阻塞的地方继续执行,可是任务2不可能执行完,因为主线程已经堵住了~
Go on
NSLog(@"1"); // 任务1dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSLog(@"2"); // 任务2});NSLog(@"3"); // 任务3
输出: 1 2 3。
Go on
dispatch_queue_t queue = dispatch_queue_create("com.fcDemo.serialQueue", DISPATCH_QUEUE_SERIAL);NSLog(@"1"); // 任务1dispatch_async(queue, ^{ NSLog(@"2"); // 任务2 dispatch_sync(queue, ^{ NSLog(@"3"); // 任务3 }); NSLog(@"4"); // 任务4});NSLog(@"5"); // 任务5
输出:1 5 2 或 1 2 5 。
Go on
NSLog(@"1"); // 任务1dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"2"); // 任务2 dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"3"); // 任务3 }); NSLog(@"4"); // 任务4});NSLog(@"5"); // 任务5
输出: 12534或15234。
Go on
dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); // 任务1 dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); // 任务2 }); NSLog(@"3"); // 任务3});NSLog(@"4"); // 任务4while (1) {}NSLog(@"5"); // 任务5
输出:14或41。
不同线程可以执行不同队列的任务