为什么Java使用线程抽象而不是协同例程?

new*_*gic 3 java concurrency multithreading

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

协同例程似乎让开发人员编写在多个函数之间跳转的代码,每次执行几个步骤,提供并发执行的假象,就像CPU在Java中的多个线程之间切换时间一样,但是协同例程允许开发人员决定何时跳出一个函数并开始执行另一个函数.这允许开发人员决定步骤应该有多细粒度,即并发度,以及何时应该发生上下文切换,这可以防止在延迟关键时进行昂贵的上下文切换.

Tar*_*rik 8

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