首先说明一下任务队列和线程是两码事

下面的例子均为在控制器的viewDidLoad函数中执行

同步

dispatch_async(dispatch_get_main_queue(), ^{xxxx
});

貌似很多人都觉得是在主线程中异步执行xxxx那样你就too yang了

那句代码是指在异步加入要执行的xxxx到主任务队列中但是什么时候执行派发机制说了算(你说了不算我说了也不算)

那有人要问了我能不能这样写

dispatch_sync(dispatch_get_main_queue(), ^{xxxx
});

恭喜你中招了 这样写会死锁这这里 让我们解释一下这个为毛会死锁 我们都知道主队列是串行队列 串行队列的特点是一个任务执行完毕在分发下一个任务去执行 但是主队列里面的任务是无穷无尽的(根runloop有关下面说)主队列的任务某一个时刻在整执行但是我们有这样写 就是导致正在执行的主队列任务阻塞起来运行我们的同步任务但是主线程不知道啊接着运行已经被阻塞的任务但是它已经被阻塞在那了 但主线头很贴被阻塞的任务不完成我就不处理下一个任务 一个劲的执行被阻塞的任务 CPU空转长时间间下去硬件就GG了这是硬件工程师不愿看到的 碰到这种情况 由硬件发生中断 被系统捕获上报异常 也就会看到

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

下面说一下主队列任务为毛无穷无尽 说起来原因就是为了让app一直运行下去的一种机制 iOS中叫Runloop就可以理解为一直跑 死循环的意思很形象也很贴切 否则的程序代码执行完毕就return了这种情况下程序就推出了还记得

int main(int argc, char * argv[]) {@autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}

还记得main.mm中的函数吗内部就是让主线程一直跑下去 (重点注意)线程跑下去的充要条件是有任务执行 其他的都没用 包括什么强引用都没卵用 所以为了主线程保活UIApplicationMain函数内部开启了一个Runloop Cocoa层接口NSRunloop CoreFoundation层接口CFRunLoopRef

所有说主任务队列中有无穷无尽的任务 这也就是不能载主队列中进行同步操作的根本原因

看到这里有人就可能会想 串行任务对列 不敢用同步操作了 小伙子不要怕 只要理清楚你的队列中是否有任务一直执行 如果有是万不能的 没有大胆放心的用吧

dispatch_queue_t queue = dispatch_queue_create("com.qmtv.queue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{for (NSUInteger i = 0; i < 5; i ++) {NSLog(@"A---%@---%lu", [NSThread currentThread], (unsigned long)i);}
});dispatch_sync(queue, ^{for (NSUInteger i = 0; i < 5; i ++) {NSLog(@"B---%@---%lu", [NSThread currentThread], (unsigned long)i);}
});

让我们运行一下

2018-08-24 17:46:34.312175+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---0
2018-08-24 17:46:34.312406+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---1
2018-08-24 17:46:34.312597+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---2
2018-08-24 17:46:34.312861+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---3
2018-08-24 17:46:34.313324+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---4
2018-08-24 17:46:34.313876+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---5
2018-08-24 17:46:34.314048+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---6
2018-08-24 17:46:34.314203+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---7
2018-08-24 17:46:34.314456+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---8
2018-08-24 17:46:34.314857+0800 GCD[97071:926186] A---<NSThread: 0x60000007cc40>{number = 1, name = main}---9
2018-08-24 17:46:34.315200+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---0
2018-08-24 17:46:34.315880+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---1
2018-08-24 17:46:34.316495+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---2
2018-08-24 17:46:34.317007+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---3
2018-08-24 17:46:34.317237+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---4
2018-08-24 17:46:34.317522+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---5
2018-08-24 17:46:34.317816+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---6
2018-08-24 17:46:34.318219+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---7
2018-08-24 17:46:34.318464+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---8
2018-08-24 17:46:34.318931+0800 GCD[97071:926186] B---<NSThread: 0x60000007cc40>{number = 1, name = main}---9

没有任何错误

异步

我知道就算我说这么多 还是有人害怕 还是会有人用 异步的 好吧 让我们再来说说异步

异步也是对任务队列而言的一样的开场白

dispatch_async(dispatch_get_main_queue(), ^{xxxx
});

任务会被在某条线程中执行完毕基本没什么好说的 但是需要注意的是我们要执行的任务到底会在那条线程上呢?这就要先说一个结论

异步不能推导出开辟了线程 开辟了线程一定能推导出异步 异步是开辟线程的必要条件

同步操作是不会开辟新的线程的

因此不能得出任务会在主线程中执行 再来一个列子

for (NSUInteger i = 0; i < 50; i ++) {dispatch_queue_t queue = dispatch_queue_create([NSString stringWithFormat:@"%lu", (unsigned long)i].UTF8String, DISPATCH_QUEUE_SERIAL);dispatch_async(queue, ^{NSLog(@"%@", [NSThread currentThread]);});
}

打印结果

2018-08-25 08:52:08.508073+0800 GrandCentralDispatch[62139:11970403] <NSThread: 0x60000046fdc0>{number = 3, name = (null)}
2018-08-25 08:52:08.508080+0800 GrandCentralDispatch[62139:11970404] <NSThread: 0x604000275380>{number = 6, name = (null)}
2018-08-25 08:52:08.508102+0800 GrandCentralDispatch[62139:11970405] <NSThread: 0x600000470b40>{number = 5, name = (null)}
2018-08-25 08:52:08.508145+0800 GrandCentralDispatch[62139:11970410] <NSThread: 0x600000470bc0>{number = 7, name = (null)}
2018-08-25 08:52:08.508158+0800 GrandCentralDispatch[62139:11970406] <NSThread: 0x604000274080>{number = 4, name = (null)}
2018-08-25 08:52:08.508207+0800 GrandCentralDispatch[62139:11970413] <NSThread: 0x600000470d00>{number = 9, name = (null)}
2018-08-25 08:52:08.508231+0800 GrandCentralDispatch[62139:11970412] <NSThread: 0x600000470d40>{number = 10, name = (null)}
2018-08-25 08:52:08.508242+0800 GrandCentralDispatch[62139:11970411] <NSThread: 0x600000470c80>{number = 8, name = (null)}
2018-08-25 08:52:08.508244+0800 GrandCentralDispatch[62139:11970414] <NSThread: 0x604000275100>{number = 11, name = (null)}
2018-08-25 08:52:08.508305+0800 GrandCentralDispatch[62139:11970415] <NSThread: 0x600000470dc0>{number = 12, name = (null)}
2018-08-25 08:52:08.508349+0800 GrandCentralDispatch[62139:11970416] <NSThread: 0x600000470e40>{number = 13, name = (null)}
2018-08-25 08:52:08.508432+0800 GrandCentralDispatch[62139:11970417] <NSThread: 0x6040002746c0>{number = 14, name = (null)}
2018-08-25 08:52:08.508516+0800 GrandCentralDispatch[62139:11970418] <NSThread: 0x604000275bc0>{number = 15, name = (null)}
2018-08-25 08:52:08.508544+0800 GrandCentralDispatch[62139:11970419] <NSThread: 0x600000471180>{number = 16, name = (null)}
2018-08-25 08:52:08.508595+0800 GrandCentralDispatch[62139:11970403] <NSThread: 0x60000046fdc0>{number = 3, name = (null)}
2018-08-25 08:52:08.508615+0800 GrandCentralDispatch[62139:11970420] <NSThread: 0x604000275d80>{number = 17, name = (null)}
2018-08-25 08:52:08.508623+0800 GrandCentralDispatch[62139:11970421] <NSThread: 0x604000276040>{number = 18, name = (null)}
2018-08-25 08:52:08.508698+0800 GrandCentralDispatch[62139:11970422] <NSThread: 0x600000470b00>{number = 19, name = (null)}
2018-08-25 08:52:08.508734+0800 GrandCentralDispatch[62139:11970423] <NSThread: 0x6040002744c0>{number = 20, name = (null)}
2018-08-25 08:52:08.508775+0800 GrandCentralDispatch[62139:11970404] <NSThread: 0x604000275380>{number = 6, name = (null)}
2018-08-25 08:52:08.508789+0800 GrandCentralDispatch[62139:11970424] <NSThread: 0x6040002743c0>{number = 21, name = (null)}
2018-08-25 08:52:08.508822+0800 GrandCentralDispatch[62139:11970425] <NSThread: 0x604000276180>{number = 22, name = (null)}
2018-08-25 08:52:08.508833+0800 GrandCentralDispatch[62139:11970426] <NSThread: 0x600000471280>{number = 23, name = (null)}
2018-08-25 08:52:08.508885+0800 GrandCentralDispatch[62139:11970427] <NSThread: 0x604000276200>{number = 24, name = (null)}
2018-08-25 08:52:08.508902+0800 GrandCentralDispatch[62139:11970428] <NSThread: 0x604000276280>{number = 25, name = (null)}
2018-08-25 08:52:08.508987+0800 GrandCentralDispatch[62139:11970430] <NSThread: 0x6000004711c0>{number = 26, name = (null)}
2018-08-25 08:52:08.509040+0800 GrandCentralDispatch[62139:11970405] <NSThread: 0x600000470b40>{number = 5, name = (null)}
2018-08-25 08:52:08.509113+0800 GrandCentralDispatch[62139:11970431] <NSThread: 0x604000276480>{number = 27, name = (null)}
2018-08-25 08:52:08.509216+0800 GrandCentralDispatch[62139:11970429] <NSThread: 0x604000276600>{number = 28, name = (null)}
2018-08-25 08:52:08.509283+0800 GrandCentralDispatch[62139:11970434] <NSThread: 0x600000471140>{number = 30, name = (null)}
2018-08-25 08:52:08.509286+0800 GrandCentralDispatch[62139:11970433] <NSThread: 0x604000276680>{number = 29, name = (null)}
2018-08-25 08:52:08.509409+0800 GrandCentralDispatch[62139:11970436] <NSThread: 0x604000276700>{number = 32, name = (null)}
2018-08-25 08:52:08.509431+0800 GrandCentralDispatch[62139:11970435] <NSThread: 0x600000471080>{number = 31, name = (null)}
2018-08-25 08:52:08.509522+0800 GrandCentralDispatch[62139:11970438] <NSThread: 0x6040002767c0>{number = 33, name = (null)}
2018-08-25 08:52:08.509584+0800 GrandCentralDispatch[62139:11970440] <NSThread: 0x6040002763c0>{number = 34, name = (null)}
2018-08-25 08:52:08.509697+0800 GrandCentralDispatch[62139:11970439] <NSThread: 0x604000276300>{number = 35, name = (null)}
2018-08-25 08:52:08.509826+0800 GrandCentralDispatch[62139:11970441] <NSThread: 0x6000004714c0>{number = 36, name = (null)}
2018-08-25 08:52:08.509933+0800 GrandCentralDispatch[62139:11970442] <NSThread: 0x6040002769c0>{number = 37, name = (null)}
2018-08-25 08:52:08.509959+0800 GrandCentralDispatch[62139:11970437] <NSThread: 0x604000276a40>{number = 38, name = (null)}
2018-08-25 08:52:08.509989+0800 GrandCentralDispatch[62139:11970443] <NSThread: 0x604000276a80>{number = 39, name = (null)}
2018-08-25 08:52:08.510077+0800 GrandCentralDispatch[62139:11970444] <NSThread: 0x604000276b00>{number = 40, name = (null)}
2018-08-25 08:52:08.510077+0800 GrandCentralDispatch[62139:11970445] <NSThread: 0x604000276b80>{number = 41, name = (null)}
2018-08-25 08:52:08.510156+0800 GrandCentralDispatch[62139:11970447] <NSThread: 0x604000276c80>{number = 43, name = (null)}
2018-08-25 08:52:08.510164+0800 GrandCentralDispatch[62139:11970446] <NSThread: 0x604000276c00>{number = 42, name = (null)}
2018-08-25 08:52:08.510214+0800 GrandCentralDispatch[62139:11970448] <NSThread: 0x604000276d00>{number = 44, name = (null)}
2018-08-25 08:52:08.510247+0800 GrandCentralDispatch[62139:11970449] <NSThread: 0x600000471800>{number = 45, name = (null)}
2018-08-25 08:52:08.510272+0800 GrandCentralDispatch[62139:11970432] <NSThread: 0x604000276d40>{number = 46, name = (null)}
2018-08-25 08:52:08.510285+0800 GrandCentralDispatch[62139:11970450] <NSThread: 0x604000276dc0>{number = 47, name = (null)}
2018-08-25 08:52:08.510330+0800 GrandCentralDispatch[62139:11970451] <NSThread: 0x6000004719c0>{number = 48, name = (null)}
2018-08-25 08:52:08.510335+0800 GrandCentralDispatch[62139:11970452] <NSThread: 0x604000276e80>{number = 49, name = (null)}

可以看出number=3的那条线程出现两次 说明某些任务使用了之前的线程 或者说异步任务有时并不会开辟新的线程

for (NSUInteger i = 0; i < 50; i ++) {dispatch_queue_t queue = dispatch_queue_create([NSString stringWithFormat:@"%lu", (unsigned long)i].UTF8String, DISPATCH_QUEUE_SERIAL);dispatch_sync(queue, ^{NSLog(@"%@", [NSThread currentThread]);});
}

打印结果

2018-08-25 08:57:25.714230+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.714470+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.714631+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.714909+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715040+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715154+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715275+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715391+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715557+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715695+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715837+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.715979+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.716165+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.716570+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.716869+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.717137+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.717343+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.717542+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.717763+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.717936+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.718231+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.718386+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.718531+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.718682+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.718834+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.718976+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.719124+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.719301+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.720072+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.720243+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.720388+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.720719+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.720861+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.721203+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.721374+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.721530+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.722184+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.722353+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.722501+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.722635+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.722778+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.722915+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.723262+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.723438+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.723730+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.723984+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.724225+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.724553+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.724722+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}
2018-08-25 08:57:25.724959+0800 GrandCentralDispatch[62236:11978540] <NSThread: 0x600000262780>{number = 1, name = main}

清一色的在主线程中执行

上面两个例子可以总结出 串行任务队列的任务执行是否开辟新的线程 与同步异步有关 同步不会开辟 异步可能会开辟

并行队列呢 接着看

for (NSUInteger i = 0; i < 50; i ++) {dispatch_queue_t queue = dispatch_queue_create([NSString stringWithFormat:@"%lu", (unsigned long)i].UTF8String, DISPATCH_QUEUE_CONCURRENT);dispatch_async(queue, ^{NSLog(@"%@", [NSThread currentThread]);});
}
2018-08-25 09:01:59.951218+0800 GrandCentralDispatch[62323:11985644] <NSThread: 0x60000026e940>{number = 3, name = (null)}
2018-08-25 09:01:59.951223+0800 GrandCentralDispatch[62323:11985642] <NSThread: 0x60000026f6c0>{number = 4, name = (null)}
2018-08-25 09:01:59.951230+0800 GrandCentralDispatch[62323:11985645] <NSThread: 0x60400027c1c0>{number = 5, name = (null)}
2018-08-25 09:01:59.951250+0800 GrandCentralDispatch[62323:11985639] <NSThread: 0x60400027b340>{number = 6, name = (null)}
2018-08-25 09:01:59.951340+0800 GrandCentralDispatch[62323:11985656] <NSThread: 0x60000026f7c0>{number = 7, name = (null)}
2018-08-25 09:01:59.951360+0800 GrandCentralDispatch[62323:11985657] <NSThread: 0x60000026f700>{number = 8, name = (null)}
2018-08-25 09:01:59.951439+0800 GrandCentralDispatch[62323:11985644] <NSThread: 0x60000026e940>{number = 3, name = (null)}
2018-08-25 09:01:59.951471+0800 GrandCentralDispatch[62323:11985642] <NSThread: 0x60000026f6c0>{number = 4, name = (null)}
2018-08-25 09:01:59.951557+0800 GrandCentralDispatch[62323:11985639] <NSThread: 0x60400027b340>{number = 6, name = (null)}
2018-08-25 09:01:59.951555+0800 GrandCentralDispatch[62323:11985645] <NSThread: 0x60400027c1c0>{number = 5, name = (null)}
2018-08-25 09:01:59.951588+0800 GrandCentralDispatch[62323:11985656] <NSThread: 0x60000026f7c0>{number = 7, name = (null)}
2018-08-25 09:01:59.951661+0800 GrandCentralDispatch[62323:11985657] <NSThread: 0x60000026f700>{number = 8, name = (null)}
2018-08-25 09:01:59.951685+0800 GrandCentralDispatch[62323:11985644] <NSThread: 0x60000026e940>{number = 3, name = (null)}
2018-08-25 09:01:59.951786+0800 GrandCentralDispatch[62323:11985658] <NSThread: 0x60000026fa80>{number = 9, name = (null)}
2018-08-25 09:01:59.951823+0800 GrandCentralDispatch[62323:11985659] <NSThread: 0x60000026f680>{number = 10, name = (null)}
2018-08-25 09:01:59.951858+0800 GrandCentralDispatch[62323:11985660] <NSThread: 0x60400027c300>{number = 11, name = (null)}
2018-08-25 09:01:59.951885+0800 GrandCentralDispatch[62323:11985661] <NSThread: 0x60000026f9c0>{number = 12, name = (null)}
2018-08-25 09:01:59.951917+0800 GrandCentralDispatch[62323:11985662] <NSThread: 0x60000026fac0>{number = 13, name = (null)}
2018-08-25 09:01:59.952001+0800 GrandCentralDispatch[62323:11985642] <NSThread: 0x60000026f6c0>{number = 4, name = (null)}
2018-08-25 09:01:59.952014+0800 GrandCentralDispatch[62323:11985665] <NSThread: 0x60000026fc00>{number = 16, name = (null)}
2018-08-25 09:01:59.952032+0800 GrandCentralDispatch[62323:11985663] <NSThread: 0x60400027b480>{number = 14, name = (null)}
2018-08-25 09:01:59.952039+0800 GrandCentralDispatch[62323:11985664] <NSThread: 0x60000026f940>{number = 15, name = (null)}
2018-08-25 09:01:59.952157+0800 GrandCentralDispatch[62323:11985666] <NSThread: 0x60000026fc80>{number = 17, name = (null)}
2018-08-25 09:01:59.952392+0800 GrandCentralDispatch[62323:11985668] <NSThread: 0x60400027d240>{number = 18, name = (null)}
2018-08-25 09:01:59.952423+0800 GrandCentralDispatch[62323:11985667] <NSThread: 0x60000026fdc0>{number = 19, name = (null)}
2018-08-25 09:01:59.952517+0800 GrandCentralDispatch[62323:11985669] <NSThread: 0x60400027d340>{number = 20, name = (null)}
2018-08-25 09:01:59.952576+0800 GrandCentralDispatch[62323:11985670] <NSThread: 0x60000026fa40>{number = 21, name = (null)}
2018-08-25 09:01:59.952749+0800 GrandCentralDispatch[62323:11985672] <NSThread: 0x60000026f840>{number = 22, name = (null)}
2018-08-25 09:01:59.953056+0800 GrandCentralDispatch[62323:11985671] <NSThread: 0x60400027d580>{number = 25, name = (null)}
2018-08-25 09:01:59.952878+0800 GrandCentralDispatch[62323:11985673] <NSThread: 0x600000270100>{number = 23, name = (null)}
2018-08-25 09:01:59.953070+0800 GrandCentralDispatch[62323:11985674] <NSThread: 0x60000026fd00>{number = 24, name = (null)}
2018-08-25 09:01:59.953115+0800 GrandCentralDispatch[62323:11985675] <NSThread: 0x60400027d400>{number = 26, name = (null)}
2018-08-25 09:01:59.953169+0800 GrandCentralDispatch[62323:11985677] <NSThread: 0x600000270380>{number = 27, name = (null)}
2018-08-25 09:01:59.953171+0800 GrandCentralDispatch[62323:11985676] <NSThread: 0x60400027d3c0>{number = 28, name = (null)}
2018-08-25 09:01:59.953462+0800 GrandCentralDispatch[62323:11985678] <NSThread: 0x6000002705c0>{number = 29, name = (null)}
2018-08-25 09:01:59.953472+0800 GrandCentralDispatch[62323:119852018-08-25 09:01:59.954227+0800 GrandCentralDispatch[62323:11985681] <NSThread: 0x60400027fc00>{number = 32, name = (null)}
639] <NSThread: 0x60400027b340>{number = 6, name = (null)}
2018-08-25 09:01:59.953897+0800 GrandCentralDispatch[62323:11985679] <NSThread: 0x600000272940>{number = 30, name = (null)}
2018-08-25 09:01:59.954212+0800 GrandCentralDispatch[62323:11985680] <NSThread: 0x600000272d00>{number = 31, name = (null)}
2018-08-25 09:01:59.954249+0800 GrandCentralDispatch[62323:11985682] <NSThread: 0x60400027fc80>{number = 33, name = (null)}
2018-08-25 09:01:59.954562+0800 GrandCentralDispatch[62323:11985683] <NSThread: 0x604000460880>{number = 34, name = (null)}
2018-08-25 09:01:59.954591+0800 GrandCentralDispatch[62323:11985684] <NSThread: 0x600000273580>{number = 35, name = (null)}
2018-08-25 09:01:59.954636+0800 GrandCentralDispatch[62323:11985685] <NSThread: 0x604000460900>{number = 36, name = (null)}
2018-08-25 09:01:59.954656+0800 GrandCentralDispatch[62323:11985686] <NSThread: 0x604000460980>{number = 37, name = (null)}
2018-08-25 09:01:59.954698+0800 GrandCentralDispatch[62323:11985687] <NSThread: 0x600000273600>{number = 38, name = (null)}
2018-08-25 09:01:59.954817+0800 GrandCentralDispatch[62323:11985688] <NSThread: 0x604000460a00>{number = 39, name = (null)}
2018-08-25 09:01:59.954820+0800 GrandCentralDispatch[62323:11985689] <NSThread: 0x600000273640>{number = 40, name = (null)}
2018-08-25 09:01:59.954834+0800 GrandCentralDispatch[62323:11985690] <NSThread: 0x604000460ac0>{number = 41, name = (null)}
2018-08-25 09:01:59.954881+0800 GrandCentralDispatch[62323:11985645] <NSThread: 0x60400027c1c0>{number = 5, name = (null)}
2018-08-25 09:01:59.955141+0800 GrandCentralDispatch[62323:11985691] <NSThread: 0x604000461d80>{number = 42, name = (null)}

也可以看到与串行线程的异步任务差不多 都有使用number=3的线程出现两次 但是不清楚为毛都是3为啥不是其他值呢待研究

for (NSUInteger i = 0; i < 50; i ++) {dispatch_queue_t queue = dispatch_queue_create([NSString stringWithFormat:@"%lu", (unsigned long)i].UTF8String, DISPATCH_QUEUE_CONCURRENT);dispatch_sync(queue, ^{NSLog(@"%@", [NSThread currentThread]);});
}
2018-08-25 09:05:59.637262+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.637501+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.637643+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.637785+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.637898+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.638081+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.638208+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.638354+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.638635+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.638936+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.639143+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.639271+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.639638+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.640119+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.640323+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.640739+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.641097+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.641347+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.641742+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.642001+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.642204+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.642547+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.642893+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.643178+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.643405+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.643632+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.643818+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.644153+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.644449+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.644685+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.644917+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.645238+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.645522+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.645710+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.646441+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.646640+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.646849+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.647478+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.647907+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.648226+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.648540+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.648929+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.649108+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.649293+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.649800+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.650010+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.650569+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.650945+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.651388+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}
2018-08-25 09:05:59.651552+0800 GrandCentralDispatch[62392:11991830] <NSThread: 0x604000078b40>{number = 1, name = main}

并行队列的同步任务也是清一色的在主线程中执行

到现在我们可以的出 那句话是否开新的线程与队列类型无关 与队列任务的同步异步有关即 同步不会开新线程 异步可能开新线程

由细心的小伙伴应该可以发现当我的串行队列和并行队列都在主线程中生产他们的任务执行也在主线程中 要是在子线程中呢没错下一个例子来了

[[[NSThread alloc] initWithBlock:^{NSLog(@"%@", [NSThread currentThread]);dispatch_queue_t queue = dispatch_queue_create("com.qmtv", DISPATCH_QUEUE_SERIAL);for (NSUInteger i = 0; i < 50; i ++) {dispatch_sync(queue, ^{NSLog(@"%@", [NSThread currentThread]);});}
}] start];

瞅一瞅结果

2018-08-25 09:14:19.619140+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.639529+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.640350+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.641648+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.642835+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.644052+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.644779+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.645137+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.645834+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.646290+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.646693+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.661954+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.662288+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.662439+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.662815+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.663044+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.663289+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.663801+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.665270+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.665645+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.679102+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.679785+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.680697+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.683770+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.684134+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.684386+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.685857+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.686884+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.688009+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.689648+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.691383+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.691674+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.691939+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.692216+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.692452+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.692798+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.693229+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.693498+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.693715+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.694436+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.694696+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.694974+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.695137+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.695383+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.695758+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.696352+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.696617+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.697134+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.697602+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.697797+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}
2018-08-25 09:14:23.698271+0800 GrandCentralDispatch[62528:12004403] <NSThread: 0x604000275b00>{number = 3, name = (null)}

全都在number=3的这条线程上执行

[[[NSThread alloc] initWithBlock:^{NSLog(@"%@", [NSThread currentThread]);dispatch_queue_t queue = dispatch_queue_create("com.qmtv", DISPATCH_QUEUE_SERIAL);for (NSUInteger i = 0; i < 50; i ++) {dispatch_async(queue, ^{NSLog(@"%@", [NSThread currentThread]);});}
}] start];

看下结果

2018-08-25 09:17:40.441840+0800 GrandCentralDispatch[62611:12010351] <NSThread: 0x60400027db00>{number = 3, name = (null)}
2018-08-25 09:17:40.449019+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.449381+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.449513+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.449928+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.450150+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.450296+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.451069+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.451582+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.451808+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.469481+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.469845+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.470146+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.470530+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.471045+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.471546+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.472218+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.473453+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.474232+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.476067+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.478674+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.479913+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.482061+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.483298+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.483722+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.483920+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.484699+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.485266+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.485778+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.486274+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.486898+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.487276+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.487635+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.487854+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.488409+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.490661+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.490931+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.491494+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.491663+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.491994+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.492378+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.492870+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.493076+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.493324+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.493673+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.493880+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.494351+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.494596+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.494973+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.495609+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}
2018-08-25 09:17:40.495880+0800 GrandCentralDispatch[62611:12010330] <NSThread: 0x60400027db00>{number = 4, name = (null)}

可以发现串行队列任务的同步任务在一条线程上执行 异步任务也在同一条线程上执行 还会有就是 同步任务所在线程与任务队列所处线程相同

看看并行队列如何

[[[NSThread alloc] initWithBlock:^{NSLog(@"%@", [NSThread currentThread]);dispatch_queue_t queue = dispatch_queue_create("com.qmtv", DISPATCH_QUEUE_CONCURRENT);for (NSUInteger i = 0; i < 50; i ++) {dispatch_sync(queue, ^{NSLog(@"%@", [NSThread currentThread]);});}
}] start];

打印顺序

2018-08-25 09:22:23.903902+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.904351+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.904602+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.906247+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.907025+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.907405+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.907626+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.907879+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.908303+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.908592+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.930231+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.931307+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.931508+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.933881+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.934998+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.938615+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.940645+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.941507+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.942235+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.942913+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.943488+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.944171+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.944346+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.944973+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.945535+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.946036+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.948377+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.948505+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.948742+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.948930+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.949222+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.949469+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.949933+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.950346+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.950568+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.950886+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.951082+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.951254+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.951613+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.951976+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.952467+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.953024+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.953639+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.953973+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.954561+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.955312+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.958078+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.958439+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.958627+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.958984+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}
2018-08-25 09:22:23.959267+0800 GrandCentralDispatch[62698:12017763] <NSThread: 0x604000463ac0>{number = 3, name = (null)}

结果与串行线程的同步任务是一样的

[[[NSThread alloc] initWithBlock:^{NSLog(@"%@", [NSThread currentThread]);dispatch_queue_t queue = dispatch_queue_create("com.qmtv", DISPATCH_QUEUE_CONCURRENT);for (NSUInteger i = 0; i < 50; i ++) {dispatch_async(queue, ^{NSLog(@"%@", [NSThread currentThread]);});}
}] start];
2018-08-25 09:24:47.769120+0800 GrandCentralDispatch[62753:12021956] <NSThread: 0x60000046f680>{number = 3, name = (null)}
2018-08-25 09:24:47.770748+0800 GrandCentralDispatch[62753:12021945] <NSThread: 0x60000046f680>{number = 4, name = (null)}
2018-08-25 09:24:47.770850+0800 GrandCentralDispatch[62753:12021951] <NSThread: 0x600000470b80>{number = 5, name = (null)}
2018-08-25 09:24:47.770899+0800 GrandCentralDispatch[62753:12021947] <NSThread: 0x600000470c40>{number = 6, name = (null)}
2018-08-25 09:24:47.770954+0800 GrandCentralDispatch[62753:12021949] <NSThread: 0x600000470c80>{number = 7, name = (null)}
2018-08-25 09:24:47.771064+0800 GrandCentralDispatch[62753:12022071] <NSThread: 0x600000470d00>{number = 8, name = (null)}
2018-08-25 09:24:47.771724+0800 GrandCentralDispatch[62753:12021945] <NSThread: 0x60000046f680>{number = 4, name = (null)}
2018-08-25 09:24:47.772724+0800 GrandCentralDispatch[62753:12022072] <NSThread: 0x604000468b00>{number = 9, name = (null)}
2018-08-25 09:24:47.773219+0800 GrandCentralDispatch[62753:12021951] <NSThread: 0x600000470b80>{number = 5, name = (null)}
2018-08-25 09:24:47.773756+0800 GrandCentralDispatch[62753:12021947] <NSThread: 0x600000470c40>{number = 6, name = (null)}
2018-08-25 09:24:47.775057+0800 GrandCentralDispatch[62753:12021949] <NSThread: 0x600000470c80>{number = 7, name = (null)}
2018-08-25 09:24:47.777410+0800 GrandCentralDispatch[62753:12022071] <NSThread: 0x600000470d00>{number = 8, name = (null)}
2018-08-25 09:24:47.780470+0800 GrandCentralDispatch[62753:12021945] <NSThread: 0x60000046f680>{number = 4, name = (null)}
2018-08-25 09:24:47.780581+0800 GrandCentralDispatch[62753:12022073] <NSThread: 0x6000004644c0>{number = 10, name = (null)}
2018-08-25 09:24:47.780949+0800 GrandCentralDispatch[62753:12022072] <NSThread: 0x604000468b00>{number = 9, name = (null)}
2018-08-25 09:24:47.781129+0800 GrandCentralDispatch[62753:12021951] <NSThread: 0x600000470b80>{number = 5, name = (null)}
2018-08-25 09:24:47.781332+0800 GrandCentralDispatch[62753:12021947] <NSThread: 0x600000470c40>{number = 6, name = (null)}
2018-08-25 09:24:47.781974+0800 GrandCentralDispatch[62753:12022074] <NSThread: 0x6000004642c0>{number = 11, name = (null)}
2018-08-25 09:24:47.782391+0800 GrandCentralDispatch[62753:12022075] <NSThread: 0x604000471bc0>{number = 12, name = (null)}
2018-08-25 09:24:47.782562+0800 GrandCentralDispatch[62753:12022076] <NSThread: 0x600000470c00>{number = 13, name = (null)}
2018-08-25 09:24:47.782618+0800 GrandCentralDispatch[62753:12022079] <NSThread: 0x600000471100>{number = 14, name = (null)}
2018-08-25 09:24:47.782648+0800 GrandCentralDispatch[62753:12022078] <NSThread: 0x600000470dc0>{number = 15, name = (null)}
2018-08-25 09:24:47.782971+0800 GrandCentralDispatch[62753:12022081] <NSThread: 0x600000470f80>{number = 16, name = (null)}
2018-08-25 09:24:47.783029+0800 GrandCentralDispatch[62753:12022082] <NSThread: 0x600000470fc0>{number = 17, name = (null)}
2018-08-25 09:24:47.783250+0800 GrandCentralDispatch[62753:12022084] <NSThread: 0x600000470e40>{number = 19, name = (null)}
2018-08-25 09:24:47.783145+0800 GrandCentralDispatch[62753:12022083] <NSThread: 0x600000471080>{number = 18, name = (null)}
2018-08-25 09:24:47.783324+0800 GrandCentralDispatch[62753:12022085] <NSThread: 0x600000471180>{number = 20, name = (null)}
2018-08-25 09:24:47.783698+0800 GrandCentralDispatch[62753:12022080] <NSThread: 0x600000471400>{number = 23, name = (null)}
2018-08-25 09:24:47.783634+0800 GrandCentralDispatch[62753:12022086] <NSThread: 0x600000471380>{number = 21, name = (null)}
2018-08-25 09:24:47.783715+0800 GrandCentralDispatch[62753:12022087] <NSThread: 0x6000004713c0>{number = 22, name = (null)}
2018-08-25 09:24:47.783697+0800 GrandCentralDispatch[62753:12022088] <NSThread: 0x600000471480>{number = 24, name = (null)}
2018-08-25 09:24:47.799717+0800 GrandCentralDispatch[62753:12021945] <NSThread: 0x60000046f680>{number = 4, name = (null)}
2018-08-25 09:24:47.799818+0800 GrandCentralDispatch[62753:12021947] <NSThread: 0x600000470c40>{number = 6, name = (null)}
2018-08-25 09:24:47.799900+0800 GrandCentralDispatch[62753:12021951] <NSThread: 0x600000470b80>{number = 5, name = (null)}
2018-08-25 09:24:47.799937+0800 GrandCentralDispatch[62753:12021949] <NSThread: 0x600000470c80>{number = 7, name = (null)}
2018-08-25 09:24:47.800006+0800 GrandCentralDispatch[62753:12022072] <NSThread: 0x604000468b00>{number = 9, name = (null)}
2018-08-25 09:24:47.799948+0800 GrandCentralDispatch[62753:12022071] <NSThread: 0x600000470d00>{number = 8, name = (null)}
2018-08-25 09:24:47.800015+0800 GrandCentralDispatch[62753:12022073] <NSThread: 0x6000004644c0>{number = 10, name = (null)}
2018-08-25 09:24:47.800072+0800 GrandCentralDispatch[62753:12022074] <NSThread: 0x6000004642c0>{number = 11, name = (null)}
2018-08-25 09:24:47.800766+0800 GrandCentralDispatch[62753:12022076] <NSThread: 0x600000470c00>{number = 13, name = (null)}
2018-08-25 09:24:47.800308+0800 GrandCentralDispatch[62753:12022075] <NSThread: 0x604000471bc0>{number = 12, name = (null)}
2018-08-25 09:24:47.801315+0800 GrandCentralDispatch[62753:12022079] <NSThread: 0x600000471100>{number = 14, name = (null)}
2018-08-25 09:24:47.801393+0800 GrandCentralDispatch[62753:12022078] <NSThread: 0x600000470dc0>{number = 15, name = (null)}
2018-08-25 09:24:47.801674+0800 GrandCentralDispatch[62753:12022091] <NSThread: 0x600000471b80>{number = 25, name = (null)}
2018-08-25 09:24:47.801770+0800 GrandCentralDispatch[62753:12022090] <NSThread: 0x604000473ac0>{number = 26, name = (null)}
2018-08-25 09:24:47.801938+0800 GrandCentralDispatch[62753:12022092] <NSThread: 0x604000473b40>{number = 27, name = (null)}
2018-08-25 09:24:47.802161+0800 GrandCentralDispatch[62753:12022081] <NSThread: 0x600000470f80>{number = 16, name = (null)}
2018-08-25 09:24:47.802713+0800 GrandCentralDispatch[62753:12022080] <NSThread: 0x600000471400>{number = 23, name = (null)}
2018-08-25 09:24:47.802922+0800 GrandCentralDispatch[62753:12022082] <NSThread: 0x600000470fc0>{number = 17, name = (null)}
2018-08-25 09:24:47.803142+0800 GrandCentralDispatch[62753:12022084] <NSThread: 0x600000470e40>{number = 19, name = (null)}
2018-08-25 09:24:47.803394+0800 GrandCentralDispatch[62753:12022083] <NSThread: 0x600000471080>{number = 18, name = (null)}

并行队列的异步任务则看不错什么规律。。。

从上面的很多例子我们能总结出一下的结论

同步不会开新线程

异步可能开新线程

串行队列的所有同步任务是队列所处的线程上执行

串行队列的所有异步任务是在同一条线程上执行的

并行队列的所有同步任务在队列所处线程上执行

并行队列的所有异步任务是根据系统负载决定在某条线程执行

但是这些结论是根据实验得到了 由于还没看GCD源码 待看过后会更正结论中错误的 如有大佬能斧正 感激不尽

iOS 玩不转的GCD第0课时相关推荐

  1. iOS多线程开发之GCD(基础篇)

    总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...

  2. iOS 多线程:『GCD』详尽总结

    原文链接:www.jianshu.com/p/2d57c7201- 感谢大家对这篇文章的喜欢和支持.为了不辜负大家的喜欢,也为了更好的让大家了解 iOS 多线程,以及 GCD 的相关知识,我对这篇文章 ...

  3. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

  4. 新能源汽车,玩不转二手市场?

    来源|子弹财经 编辑|许芸 公安部数据显示,截至2019年底,全国新能源汽车保有量达381万辆.而据乘联会数据,2020年全年新能源乘用车批发销量总计117万辆,同比增长12%:零售销量总计110.9 ...

  5. 本地生活服务 巨头们玩不转的电商蓝海

    今日,由国内领先的电商系统及服务提供商千米网主办的"中国首届本地生活电商大会"将在南京隆重召开.这是一场被誉为中国本地生活电商领域规模最大.含金量最高的行业盛会,吸引无数电商人关注 ...

  6. 没有它你的DevOps是玩不转的,你信不?

    摘要:架构的选择对于DevOps的实践是至关重要的,从某种程度上来说,架构就是DevOps这场战役的粮草,它是支撑着DevOps成功落地的重要前提. 善用兵者,役不再籍,粮不三载.取用于国,因粮于敌, ...

  7. SAP License:云ERP真的已经玩不转了吗?

    注:以下云ERP特指Saas ERP,非指ERP系统部署在云端. 不得不说,如今市场对传统ERP的接受度要远比云ERP高得多,95%的中大型企业在选ERP的时候无一例外都考虑传统ERP.按道理来说云是 ...

  8. 关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流

    原文地址:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.ht ...

  9. 荣耀6x升级Android8省电,HONOR 荣耀 畅玩 6X 手机升级EMUI8.0,怎一个“爽”字了得?...

    HONOR 荣耀 畅玩 6X 手机升级EMUI8.0,怎一个"爽"字了得? 2018-07-23 21:12:25 0点赞 0收藏 0评论 2016年双十一零点,在媳妇儿" ...

最新文章

  1. CC2530中常用的控制寄存器
  2. 计算机的特别及应用,[计算机软件及应用]Excel使用技巧-非常全.doc
  3. Web产品的交互说明文档应该怎么写?
  4. java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?
  5. 在Struts2中实现文件上传(二)
  6. 如何解读Nginx源码
  7. Java编程书籍收集(高级)
  8. 恶意文件 大数据案例库_无文件恶意软件感染完整指南
  9. mysql in 子查询 效率慢 优化(转)
  10. 阿里云携手蓝凌软件,打造全球化企业智慧办公平台
  11. vasp能装在window系统里吗_vasp 5.4.4 在win10/Ubuntu 18.04上的安装
  12. matlab-博弈演化
  13. 通过注册表永久禁用系统UAC功能
  14. 文档大小超出上传限制怎么办_有道翻译和翻译狗,哪个更适合翻译文档?
  15. VR全景营销实质体验店铺的实际情况
  16. HTML5学习第6篇—video:自己实现video的播放控件(添加样式版)
  17. python爬虫属于大数据吗_学Python可以从事大数据和爬虫工程师吗?
  18. android朋友圈发文字换行,朋友圈发文字怎么才显示全文 多按几次换行(大概10次左右...
  19. 蜂房问题-蜜蜂在蜂房中只能向下或者右上方爬,从a位置爬到b位置有多少种途径
  20. C++开发STM32 Makefile工程

热门文章

  1. 什么是数字孪生专用引擎技术
  2. 已解决vue-router4路由报“[Vue Router warn]: No match found for location with path“
  3. webstorm配置环境变量_Webstorm 配置与使用 Less
  4. AWS推出Outposts,混合云市场战争一触即发!
  5. 直观理解语义分割中IOU
  6. Vue2父传子、子传父和兄弟间互传
  7. 整合营销系统推荐乐云seo_珠海整合营销【乐云seo】
  8. 机器视觉、模式识别库
  9. 国内10个最佳PS教程网站
  10. 【图形学】布林冯BlinnPhong