多线程
let queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL) NSLog("之前 - %@", NSThread.currentThread()) dispatch_async(queue, { () -> Void in //1 NSLog("sync之前 - %@", NSThread.currentThread()) dispatch_sync(queue, { () -> Void in //2 NSLog("sync - %@", NSThread.currentThread()) // 无法输出 线程已卡死 }) NSLog("sync之后 - %@", NSThread.currentThread()) // 无法输出 线程已卡死 }) NSLog("之后 - %@", NSThread.currentThread())
输出为:
2015-07-30 02:06:51.058 test[33329:8793087] 之前 - <NSThread: 0x7fe32050dbb0>{number = 1, name = main}
2015-07-30 02:06:51.059 test[33329:8793356] sync之前 - <NSThread: 0x7fe32062e9f0>{number = 2, name = (null)}
2015-07-30 02:06:51.059 test[33329:8793087] 之后 - <NSThread: 0x7fe32050dbb0>{number = 1, name = main}
很明显
sync - %@
和 sync之后 - %@
没有被打印出来!这是为什么呢?我们再来分析一下因为 注释2 这里分配的是同步队列 所以会在当前任务执行完成后执行 否则无法执行其它任务
但是 当前任务包含了 sync 任务本身
所以这里就会发生一个 死锁现象了 所以sync所在的线程就被卡死了 ( 如果是主线程发生这种情况 程序就崩溃了 --博主推测 还没有验证过)
NOTE:大家可能发现了一个问题,为什么我在 Swift 里打印输出使用
NSLog()
而不是 println()
呢?原因是使用 print() / println()
输出的话,它会简单地使用 流(stream) 的概念,学过 C++ 的都知道。它会把需要输出的每个字符一个一个的输出到控制台。普通使用并没有问题,可是当多线程同步输出的时候问题就来了,由于很多 println()
同时打印,就会导致控制台上的字符混乱的堆在一起,而NSLog() 就没有这个问题。到底是什么样子的呢?你可以把上面 NSLog()
改为 println()
,然后一试便知。