原则上,一个串行的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")
}
结果是:
// IN 1 -> OUT of 1 -> IN 2 ?
// or IN 1 -> IN 2 -> OUT of 1 ?
我尝试在 playground 中运行代码,但似乎 sleep
(和 Thread.sleep
)在 Playground 中不起作用。
最佳答案
串行队列在前一个 block 完成之前不会开始执行下一个 block 。上下文切换不会影响这一点。如果您在提交给串行队列的 block 中调用 sleep
,这将阻塞队列,直到 sleep 结束并且您的 block 可以恢复执行。所以你的结果将是 IN 1 -> OUT of 1 -> IN 2
。
请注意,通常您不想在提交到队列的 block 中执行阻塞操作(如 sleep
),因为这会阻塞整个线程,使 libdispatch 无法使用用于其他工作。 libdispatch 将根据需要启动新线程以继续工作,但它会产生多少新线程是有限制的。
关于swift - 如果在串行 DispatchQueue 中触发上下文切换会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46551774/