同步执行 + 并发队列
在当前线程中执行任务, 不会开启新线程, 执行完一个任务, 再执行下一个任务.
- /**
- * 同步执行 + 并发队列
- * 特点: 在当前线程中执行任务, 不会开启新线程, 执行完一个任务, 再执行下一个任务.
- */
- - (void)syncConcurrent {
- NSLog(@"currentThread---%@",[NSThread currentThread]); // 打印当前线程
- NSLog(@"syncConcurrent---begin");
- dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
- dispatch_sync(queue, ^{
- // 追加任务 1
- for (int i = 0; i <2; ++i) {
- [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
- NSLog(@"1---%@",[NSThread currentThread]); // 打印当前线程
- }
- });
- dispatch_sync(queue, ^{
- // 追加任务 2
- for (int i = 0; i < 2; ++i) {
- [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
- NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程
- }
- });
- dispatch_sync(queue, ^{
- // 追加任务 3
- for (int i = 0; i < 2; ++i) {
- [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
- NSLog(@"3---%@",[NSThread currentThread]); // 打印当前线程
- }
- });
- NSLog(@"syncConcurrent---end");
- }
输出结果:
输出结果:
- 2018-02-23 20:34:55.095932+0800 YSC-GCD-demo[19892:4996930] currentThread---<NSThread: 0x60400006bbc0>{number = 1, name = main}
- 2018-02-23 20:34:55.096086+0800 YSC-GCD-demo[19892:4996930] syncConcurrent---begin
- 2018-02-23 20:34:57.097589+0800 YSC-GCD-demo[19892:4996930] 1---<NSThread: 0x60400006bbc0>{number = 1, name = main}
- 2018-02-23 20:34:59.099100+0800 YSC-GCD-demo[19892:4996930] 1---<NSThread: 0x60400006bbc0>{number = 1, name = main}
- 2018-02-23 20:35:01.099843+0800 YSC-GCD-demo[19892:4996930] 2---<NSThread: 0x60400006bbc0>{number = 1, name = main}
- 2018-02-23 20:35:03.101171+0800 YSC-GCD-demo[19892:4996930] 2---<NSThread: 0x60400006bbc0>{number = 1, name = main}
- 2018-02-23 20:35:05.101750+0800 YSC-GCD-demo[19892:4996930] 3---<NSThread: 0x60400006bbc0>{number = 1, name = main}
- 2018-02-23 20:35:07.102414+0800 YSC-GCD-demo[19892:4996930] 3---<NSThread: 0x60400006bbc0>{number = 1, name = main}
- 2018-02-23 20:35:07.102575+0800 YSC-GCD-demo[19892:4996930] syncConcurrent---end
从同步执行 + 并发队列中可看到:
所有任务都是在当前线程 (主线程) 中执行的, 没有开启新的线程(同步执行不具备开启新线程的能力).
所有任务都在打印的 syncConcurrent---begin 和 syncConcurrent---end 之间执行的(同步任务需要等待队列的任务执行结束).
任务按顺序执行的. 按顺序执行的原因: 虽然并发队列可以开启多个线程, 并且同时执行多个任务. 但是因为本身不能创建新线程, 只有当前线程这一个线程(同步任务不具备开启新线程的能力), 所以也就不存在并发. 而且当前线程只有等待当前队列中正在执行的任务执行完毕之后, 才能继续接着执行下面的操作(同步任务需要等待队列的任务执行结束). 所以任务只能一个接一个按顺序执行, 不能同时被执行.
昨天的文章没有排版好, 给大家说一声抱歉, 以后每天进行更新, 文章来源于网络, 如有侵权, 请联系小编删除, 大家有什么比较好的文章也可以发给我一起分享. 因为想要一起学习交流 iOS 也不是很容易, 所有小编也给大家推荐一个交流群: 681-503-716, 加群填我的 id 或者这篇文章的题目就行, 希望对大家有所帮助.
来源: http://www.jianshu.com/p/e7b6b4505994