2

我发现串行队列将使用多个线程来运行异步代码。这是操场上的测试代码。

import Foundation  

let q = DispatchQueue(label: "test")  
q.async {  
    print("hi \(Thread.current)")  
}  
q.async {  
    print("hi \(Thread.current)")  
}  
q.async {  
    print("hi \(Thread.current)")  
}  
q.async {  
    print("hi \(Thread.current)")  
}  
q.async {  
    print("hi \(Thread.current)")  
}  

当我反复执行操场时,有时会出现这样的输出。据我了解,串行队列应该只使用一个线程,但日志显示它使用了 2 个线程。我真的很困惑。什么是正确的行为?

hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}  
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}  
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}  
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}  
hi <NSThread: 0x7fc26b1003e0>{number = 3, name = (null)} 
4

1 回答 1

4

您说得对,串行队列在“a”时间只会使用 1 个线程。

但是,同一个线程(NSThread 对象)会执行每个排入队列的代码块吗?不。

为了使第一个陈述更加清晰,我将对其进行重新措辞..

串行队列每次块执行一次只使用 1 个线程。这意味着两个线程永远不会在任何时间点对任何代码块进行操作。

不能保证哪个线程执行从队列中入队/出队 FIFO 顺序的代码。但可以保证的是,任何“一个”任意工作线程都将执行该操作。

据我所知,在内部,对于每个块,线程分配都是自动的。“只有一个线程”并不意味着“总是相同的线程”。

于 2020-01-18T17:59:51.320 回答