为什么这段代码在 Xcode 和 Swift Playground 中运行时会产生不同的输出?
for i in 0...10 {
DispatchQueue.global().async {
DispatchQueue.global().sync {
print("Print1",i)
}
print("Print2",i)
}
}
Swift Playground 输出: 打印1 0 打印1 1 打印1 4 打印1 2 打印1 5 打印1 3 打印1 7 打印1 6 打印1 8 打印1 9 打印1 10 打印2 10 打印2 4 打印2 2 打印2 6 打印2 1 打印2 3 打印2 8 打印2 5 打印2 7 打印2 0 打印2 9
Xcode 输出: 打印1 0 打印2 0 打印1 2 打印1 3 打印1 4 打印2 4 打印1 6 打印2 6 打印1 8 打印2 8 打印1 10 打印2 10 打印2 2 打印2 3 打印1 5 打印2 5 打印1 9 打印2 9 打印1 7 打印2 7 打印1 1 打印2 1
我在不同平台上运行,结果都是一样的。
调用
DispatchQueue.global().async
将您传递的闭包添加到全局并发调度队列。
您可以将全局并发调度队列视为操作系统的作业 jar。操作系统正在管理设备上所有不同 CPU 核心上的任务。当操作系统运行时,不同的 CPU 核心变得可用,操作系统进入“作业 jar”并提取任务,将其交给其中一个核心来执行。哪个核心获得哪个工作是不可预测的,因为它取决于系统上正在发生的其他事情。同样,每个任务可能需要不同的运行时间,具体取决于它在完成之前是否被中断(以及各种其他因素)。
这就是为什么当您在应用程序中运行代码时,打印语句以随机顺序显示。每次运行应用程序时,打印语句都会以不同的顺序显示。
您列出的输出在游乐场和从应用程序运行时都是半随机顺序的。
您列出的 Swift Playground 输出将 print1 输出显示为 0, 1, 4, 2, 5, 3, 7, 6, 8, 9, 10, print2 输出显示为 10, 4, 2, 6, 1, 3, 8, 5, 7, 0, 9.