这段代码输出的顺序总是1 5 2 4 3吗?
Translated text:
这段代码输出的顺序总是1 5 2 4 3吗?
print("1")
DispatchQueue.main.async {
print("2")
DispatchQueue.main.async {
print(3)
}
print("4")
}
print("5")
我觉得答案是否定的,但我无法解释清楚,希望有人能够澄清我的理解。谢谢!
这段代码输出的顺序总是1 5 2 4 3吗?
这段代码输出的顺序总是1 5 2 4 3吗?
print("1")
DispatchQueue.main.async {
print("2")
DispatchQueue.main.async {
print(3)
}
print("4")
}
print("5")
我觉得答案是否定的,但我无法解释清楚,希望有人能够澄清我的理解。谢谢!
这取决于你从哪个线程开始操作。
如果你从主线程开始,那么你会得到1, 5, 2, 4, 3
如果你从后台线程开始,大多数情况下你会得到相同的结果(1, 5, 2, 4, 3
),但这并不保证,因为后台线程随时可以被操作系统挂起,如果这发生在print(5)
调用之前,那么5将是最后一个被打印的。
请注意,如果问题中的代码是你应用程序/工作区中唯一的代码,那么你可能会惊讶地遇到部分打印输出,因为应用程序/工作区在命中print(5)
行后立即退出,没有机会执行异步调度。为了规避这个问题,你可以确保RunLoop.current.run()
在代码的最后部分在主线程上执行。
这里有一些示意图,试图阐述只使用主线程的情况和涉及后台线程的情况:
print("5")
的输出可以与来自主队列的打印混合。这就是为什么从后台启动时,5可以出现在1之后的任何位置。func asyncTest() {
print("1")
DispatchQueue.main.async {
print("2")
DispatchQueue.main.async {
print(3)
}
print("4")
}
for _ in 0...1000 {
}
print("5")
}
DispatchQueue.global(qos: .background).async {
asyncTest()
}
循环存在导致数字5在出现之前需要稍微等待一段时间,这使得主队列能够在输出5之前执行一些操作。如果没有循环,后台线程执行得太快,所以数字5会在2之前出现。PlaygroundPage.current.needsIndefiniteExecution = true
将其移至游乐场的顶部(导入之后)。您还需要:
import PlaygroundSupport
print("1")
是否在主线程中执行。 - OOPer