Neo*_*ang 1 multithreading grand-central-dispatch swift swift-playground
原则上,串行DispatchQueue会一个接一个地执行提交的任务。但是,如果在一项任务中触发了上下文切换(例如,调用sleep)怎么办?队列是立即执行下一个任务,还是等待当前任务完成?
对于此代码:
q.async {
print("IN 1")
var i = 1
while i < 10 {
Thread.sleep(forTimeInterval: 0.1)
i += 1
}
print("OUT of 1")
}
q.async {
print("IN 2")
}
Run Code Online (Sandbox Code Playgroud)
结果是:
// IN 1 -> OUT of 1 -> IN 2 ?
// or IN 1 -> IN 2 -> OUT of 1 ?
Run Code Online (Sandbox Code Playgroud)
我尝试在操场上运行代码,但似乎sleep(和Thread.sleep)在操场中不起作用。
串行队列在前一个块完成之前不会开始执行下一个块。上下文切换对此没有影响。如果您调用sleep提交到串行队列的块,这将阻塞队列,直到睡眠完成并且您的块可以继续执行。所以你的结果将是IN 1 -> OUT of 1 -> IN 2.
请注意,通常您不希望sleep在提交到队列的块中执行阻塞操作(例如),因为这会阻塞整个线程,从而使 libdispatch 无法用于其他工作。libdispatch 将根据需要启动新线程以继续工作,但它会产生多少新线程是有限制的。