串行调度队列将仅使用一个线程?

时间:2018-06-27 07:55:15

标签: ios swift multithreading macos dispatch-queue

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

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)} 

1 个答案:

答案 0 :(得分:2)

您说的很对,串行队列在“ a”时间仅使用1个线程。

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

为使第一句话更加清晰,我将其重新措辞。.

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

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

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