iOS GCD全局队列优先级均为0.5

iOS GCD global queue priority both 0.5

我遇到的问题是为什么下面的代码打印出来的优先级是一样的?为什么是这样?非常感谢。

    print("main:\(Thread.current)")
    print("thread main priorities:\(Thread.current.threadPriority)")

    DispatchQueue.global(qos: .utility).async {
        print("utility:\(Thread.current)")
        print("thread utility priorities:\(Thread.current.threadPriority)")
    }

    DispatchQueue.global(qos: .background).async {
        print("background:\(Thread.current)")
        print("thread background priorities:\(Thread.current.threadPriority)")
    }

    DispatchQueue.global(qos: .userInteractive).async {
        print("userInteractive:\(Thread.current)")
        print("thread userInteractive priorities:\(Thread.current.threadPriority)")
    }

    DispatchQueue.global(qos: .userInitiated).async {
        print("userInitiated:\(Thread.current)")
        print("thread userInitiated priorities:\(Thread.current.threadPriority)")
    }

日志:

main:{number = 1, name = main} 主线程 priorities:0.5

userInteractive:{number = 3, name = (null)}

效用:{number = 5, name = (null)}

背景:{number = 6, name = (null)}

线程用户交互 priorities:0.5

userInitiated:{number = 4, name = (null)}

线程实用程序 priorities:0.5

线程背景priorities:0.5

线程用户启动priorities:0.5

如您在文档中所见:

@available(iOS 4.0, *)
open var threadPriority: Double // To be deprecated; use qualityOfService below

threadPriority 已弃用。此外,Apple 的 GCD 团队在 Thread - Queue 主题上已经非常清楚。 GCD 将为您管理线程。队列优先级不是线程优先级。看看这个例子,这是你在这里发布的代码,我只是添加了 "qos_class_self().rawValue",这实际上是你应该如何测试 QoS,而不是 "threadPriority".

print("main:\(Thread.current), Thread main priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")

DispatchQueue.global(qos: .utility).async {
    print("utility:\(Thread.current), Thread utility priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

DispatchQueue.global(qos: .background).async {
    print("background:\(Thread.current), Thread background priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

DispatchQueue.global(qos: .userInteractive).async {
    print("userInteractive:\(Thread.current), Thread userInteractive priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

DispatchQueue.global(qos: .userInitiated).async {
    print("userInitiated:\(Thread.current), Thread userInitiated priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

我还合并了每个闭包的打印,这样它们就不会在日志的不同行中被打乱。这表明 QoS 得到维护,而 threadPriority 已弃用。

main:<NSThread: 0x6100000762c0>{number = 1, name = main}, Thread main priorities:0.5, QoS: 33
userInteractive:<NSThread: 0x610000261fc0>{number = 4, name = (null)}, Thread userInteractive priorities:0.5, QoS: 33
utility:<NSThread: 0x618000079100>{number = 3, name = (null)}, Thread utility priorities:0.5, QoS: 17
userInitiated:<NSThread: 0x608000078380>{number = 5, name = (null)}, Thread userInitiated priorities:0.5, QoS: 25
background:<NSThread: 0x610000262000>{number = 6, name = (null)}, Thread background priorities:0.5, QoS: 9

所以,最后,要点不是考虑线程,而是考虑队列、它们的 QoS 并知道 GCD 会为您管理线程。与 GCD 出现队列之前我们习惯的概念截然不同。