DispatchQueue优先级和线程分析?

时间:2018-03-07 11:08:13

标签: ios iphone swift multithreading

 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时结果都不一致

enter image description here

enter image description here

enter image description here

enter image description here

那么如何知道哪个线程先运行或运行哪个顺序?

1 个答案:

答案 0 :(得分:3)

  

那么如何知道哪个线程先运行或运行哪个顺序?

你不能。

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

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

qos值会有所不同,但仅限于资源有限的情况。

修改

在我写答案时没有发现sync电话。但是,它只会微不足道地改变一切。 sync块始终在main块之前运行,因为main块在当前事件完成之前无法运行,这将阻塞,直到sync调用完成。

即使GCD优先sync超过async,您仍然无法判断它何时会运行,因为您在async来电之前启动了所有sync次来电。他们完全有可能在sync电话开始前完成。

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