override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
DispatchQueue.main.async {
print("MAIN ASYNC")
}
DispatchQueue.global().async {
print("GLOBAL ASYNC ")
}
DispatchQueue.global(qos: .userInitiated).async {
print("GLOBAL ASYNC USER INITIATED ")
}
DispatchQueue.global(qos: .default).async {
print("GLOBAL ASYNC USER Default ")
}
DispatchQueue.global(qos: .userInteractive).async {
print("GLOBAL ASYNC USER INTERACTIVE")
}
DispatchQueue.global().sync {
print("GLOBAL SYNC ")
}
}
每次我运行IT时结果都会变化
那么如何知道哪个线程首先运行或它们将以哪个顺序运行?
最佳答案
你不能
全局队列是并发队列,因此它将根据线程池的大小并行运行多个任务。如果池足够大,可以一次将线程分配给所有任务,则它们将全部并行运行,并且打印语句在日志中出现的顺序或多或少是不确定的。
请注意,您在主队列上启动的一个线程的处理方式有所不同。主队列上的任务由运行循环处理,这意味着您的异步任务要等到当前事件完成后才能启动。如果您使用viewDidLoad
,则当前事件正在启动应用程序,因此您的主队列任务可能会延迟相对较长的时间。这就是为什么它总是出现在输出的最后。
qos值将有所作为,但仅在资源受限的情况下。
编辑
我写答案时没有发现sync
调用。但是,它只会使变化最小。 sync
块将始终在main
块之前运行,因为main
块在当前事件完成之前无法运行,而该事件在sync
调用完成之前将一直阻塞。
即使GCD优先于sync
而不是async
,您仍然无法确定何时运行,因为您在async
调用之前启动了所有sync
调用。他们很可能在sync
调用甚至开始之前就已经完成了。
同样适用于qos。如果先调度低优先级块,然后调度高优先级块,则低优先级块可以在主线程甚至到达高优先级块的async
之前启动(并完成)。
关于ios - DispatchQueue优先级和线程分析?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49150424/