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时结果都会变化

ios - DispatchQueue优先级和线程分析?-LMLPHP

ios - DispatchQueue优先级和线程分析?-LMLPHP

ios - DispatchQueue优先级和线程分析?-LMLPHP

ios - DispatchQueue优先级和线程分析?-LMLPHP

那么如何知道哪个线程首先运行或它们将以哪个顺序运行?

最佳答案



你不能

全局队列是并发队列,因此它将根据线程池的大小并行运行多个任务。如果池足够大,可以一次将线程分配给所有任务,则它们将全部并行运行,并且打印语句在日志中出现的顺序或多或少是不确定的。

请注意,您在主队列上启动的一个线程的处理方式有所不同。主队列上的任务由运行循环处理,这意味着您的异步任务要等到当前事件完成后才能启动。如果您使用viewDidLoad,则当前事件正在启动应用程序,因此您的主队列任务可能会延迟相对较长的时间。这就是为什么它总是出现在输出的最后。

qos值将有所作为,但仅在资源受限的情况下。

编辑

我写答案时没有发现sync调用。但是,它只会使变化最小。 sync块将始终在main块之前运行,因为main块在当前事件完成之前无法运行,而该事件在sync调用完成之前将一直阻塞。

即使GCD优先于sync而不是async,您仍然无法确定何时运行,因为您在async调用之前启动了所有sync调用。他们很可能在sync调用甚至开始之前就已经完成了。

同样适用于qos。如果先调度低优先级块,然后调度高优先级块,则低优先级块可以在主线程甚至到达高优先级块的async之前启动(并完成)。

关于ios - DispatchQueue优先级和线程分析?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49150424/

10-12 20:50