我从事过 Java 工作,并且非常清楚线程和线程池的工作原理。
我想知道是否有人可以解释如何在 swift 中创建线程和在线程池中分配空间?
还有,是吗
Dispatch.main.async {
// some code
}
创建新线程还是异步执行任务?
提前致谢 =)
最佳答案
队列和线程是不同的概念。队列是要执行的 block 的有序(有时是优先级)序列。作为(主要)实现细节, block 必须被安排到线程上才能执行,但这不是它们的重点。
所以 Dispatch.main.async
分派(dispatch)(追加)一个 block 到主队列。主队列是串行的并且有些特殊,因为它 promise 也将专门在主线程上运行(如 Paulw11 所述)。它还 promise 与主运行循环相关联。理解这个“将 block 附加到队列”的概念是至关重要的,因为它对你如何在队列中设计事物与你如何在线程中设计事物有重大影响。 async
并不意味着“现在就开始运行”。它的意思是“将它放在队列中,但不要等待它。”
作为设计如何不同的一个很好的例子,将某些东西放在队列中并不意味着它会永远运行(即使没有错误或死锁)。挂起队列以停止调度 block 是可能且有用的。可以将队列绑定(bind)到其他队列,这样当一个队列"dispatch"某事时,它只是将它放到另一个队列而不是执行它。您可以使用与“后台运行”无关的队列做很多事情。您可以将完成处理程序附加到 block 。您可以使用组来等待 block 集合。 GCD 是一种思考并发的方式。并行性只是一个附带的好处。 (关于这个概念的精彩讨论是 Concurrency is not parallelism by Rob Pike。它在 Go 中,但这些概念仍然适用。)
如果您在主队列上运行时调用 Dispatch.main.async
,那么该 block 肯定不会执行,直到当前 block 完成。在 UIKit 和 AppKit 中,“当前 block 完成”通常意味着“您从操作系统调用的方法返回”。虽然没有以这种方式实现,但您可以假装每次从操作系统调用您时,它都包含在对 Dispatch.main.async
的调用中。
这也是为什么您绝不能从主队列调用 Dispatch.main.sync
(注意 sync
)的原因。该 block 将等待您返回,您将等到 block 完成。典型的僵局。
通常,在 iOS 中线程池不是你的事。它是一个实现细节。有时出于性能原因您需要考虑它,但如果您考虑太多,您可能没有正确设计并发性。
如果您来自 Java,您肯定想阅读 Migrating Away From Threads在并发编程指南中。它是有关如何重新思考队列中基于线程的模式的权威资源。
关于ios - 线程池 : DispatchQueue. main.async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43631158/