关于多线程:为什么Java为什么使用线程抽象而不是协程?

Why does Java use a thread abstraction instead of co-routines?

在Lua中遇到了协同例程的概念后,我觉得这些似乎是对并发软件进行编程的更好的模型,我想知道为什么Java中没有使用它?

协同例程似乎使开发人员可以编写在多个功能之间跳转的代码,每次每次执行几个步骤,从而提供了并发执行的错觉,其方式与CPU在Java中在多个线程之间进行时间划分的方式几乎相同。 协同例程使开发人员可以决定何时退出一个功能并开始执行另一个功能。 这使开发人员可以决定这些步骤应具有的精细程度,即并发程度,以及何时应进行上下文切换,这可以在延迟至关重要的情况下避免进行昂贵的上下文切换。


协程很强大,但不能替代完整的多线程应用程序,因为协程运行在单个线程上。 因此,当需要执行CPU密集型任务时,它们将不会使用多个内核。 我认为它们代表了一种互补的范例,而不是一种竞争的范例。 正如在.Net平台上所做的那样,函数式编程正在进入Java。 协程将最终跟随套件。 我建议您查看Java路线图以获取更多信息。
请参阅进程,线程,绿色线程,原型线程,纤维,协程:有何区别? 以获得涵盖协程和其他概念的更详尽的答案。
另请参阅使用协程与线程时的吞吐量差异,讨论使用协程而不是多个线程来实现生产者消费者问题的实现。