serial Dispatch Queue 将只使用一个线程?
serial Dispatch Queue will use only one thread?
我发现串行队列将使用多个线程来 运行 异步代码。
这是操场上的测试代码。
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)")
}
当我重复执行playground时,有时会出现这样的输出。在我的理解中,串行队列应该只使用一个线程,但日志显示它使用了 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)}
你说得对,串行队列在 "a" 时间只使用 1 个线程。
但是同一个线程(NSThread 对象)会执行每个排入队列的代码块吗?编号
为了使第一个陈述更加清晰,我将重新措辞..
串行队列在每个块执行时一次只使用 1 个线程。这意味着两个线程永远不会在任何时间点对任何代码块进行操作。
哪个线程执行enqueued/dequeued 队列中的 FIFO 顺序的代码无法保证。但是可以保证任何 "one" 任意工作线程都将执行该操作。
据我所知,在内部,对于每个块,线程分配是自动的。 "One thread only" 不代表 "same thread always".
我发现串行队列将使用多个线程来 运行 异步代码。 这是操场上的测试代码。
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)")
}
当我重复执行playground时,有时会出现这样的输出。在我的理解中,串行队列应该只使用一个线程,但日志显示它使用了 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)}
你说得对,串行队列在 "a" 时间只使用 1 个线程。
但是同一个线程(NSThread 对象)会执行每个排入队列的代码块吗?编号
为了使第一个陈述更加清晰,我将重新措辞..
串行队列在每个块执行时一次只使用 1 个线程。这意味着两个线程永远不会在任何时间点对任何代码块进行操作。
哪个线程执行enqueued/dequeued 队列中的 FIFO 顺序的代码无法保证。但是可以保证任何 "one" 任意工作线程都将执行该操作。
据我所知,在内部,对于每个块,线程分配是自动的。 "One thread only" 不代表 "same thread always".