【发布时间】:2018-03-07 05:50:36
【问题描述】:
这些队列管理您提供给 GCD 的任务并以先进先出的顺序执行这些任务。这保证了添加到队列的第一个任务是队列中启动的第一个任务,添加的第二个任务将是第二个启动的任务,依此类推。 下面的代码
let anotherQueue = DispatchQueue(label: "com.gcdTest.Queue", qos: .userInteractive)
anotherQueue.async {
anotherQueue.async{
anotherQueue.async{
anotherQueue.async {
print("task 6")
for _ in 1...300 { }
}
}
print("task 3")
for _ in 301...600 {}
}
anotherQueue.async{
anotherQueue.async{
print("task 5")
for _ in 700...900 {}
}
print("task 4")
for _ in 5000...7000 {}
}
print("task 1")
for _ in 9000...10000 {}
}
anotherQueue.async {
print("task 2")
for _ in 1...1000 {}
}
产生输出
task 1
task 2
task 3
task 4
task 5
task 6
但是当我们在 Concurrent 中运行相同的代码时,它会产生不可预测的输出。 例如:- 将第一行代码更改为以下行
let anotherQueue = DispatchQueue(label: "com.gcdTest.Queue", qos: .userInteractive, attributes: .concurrent)
输出
task 3
task 2
task 1
task 4
task 5
task 6
根据定义,它指出 并发队列中的任务保证按照它们被添加的顺序开始......这就是你所保证的一切!
因此,期望串行队列(默认情况下)产生类似的输出。 (任务 1、任务 2、任务 3、任务 4、任务 5、任务 6) 请任何人帮助我,我哪里出错了。
【问题讨论】:
-
既然任务是并行执行的,为什么你期望与串行任务的顺序相同?
-
因为并发队列中的任务保证按照它们添加的顺序开始。
-
是的,但是线程启动和
print调用是分开的,线程可以启动但它可以在它结束执行print调用之前进入睡眠状态 -
现在清楚了,谢谢 Cristik,
标签: ios swift grand-central-dispatch