Why does Java use a thread abstraction instead of co-routines?
在Lua中遇到了协同例程的概念后,我觉得这些似乎是对并发软件进行编程的更好的模型,我想知道为什么Java中没有使用它?
协同例程似乎使开发人员可以编写在多个功能之间跳转的代码,每次每次执行几个步骤,从而提供了并发执行的错觉,其方式与CPU在Java中在多个线程之间进行时间划分的方式几乎相同。 协同例程使开发人员可以决定何时退出一个功能并开始执行另一个功能。 这使开发人员可以决定这些步骤应具有的精细程度,即并发程度,以及何时应进行上下文切换,这可以在延迟至关重要的情况下避免进行昂贵的上下文切换。
-
很难回答这些"为什么X不做Y?"问题。通常情况下,设计决策并不隐秘。您是否会对以下问题的答案感兴趣:"使用线程模型与协同例程相比有什么好处?"
-
当然病了,谢谢。
-
@ user1037729协程提供了一种控制问题中流程的方法。它们本身与并发无关(嗯,如果您实现异步/等待C#之类的东西,它们会提供不错的语法糖,但实际上并不是在那里工作的协程)。您的问题就像"为什么Java为什么使用线程抽象而不是for循环"。
-
您运行的线程通常多于拥有内核的线程,因此两个或多个线程共享一个内核,这意味着这些线程的执行是分步进行的,这必须与协同例程的操作相同,所以我除非您每个内核有一个线程,否则他们不会说它们有很大不同。
-
协程允许"冻结"函数的执行,并在同一点或另一点恢复。这允许留下多个执行线程的印象,尽管不是同时发生的。因此,@ BenjaminGruenbaum坚持认为,这种比较并不荒谬。
协程很强大,但不能替代完整的多线程应用程序,因为协程运行在单个线程上。 因此,当需要执行CPU密集型任务时,它们将不会使用多个内核。 我认为它们代表了一种互补的范例,而不是一种竞争的范例。 正如在.Net平台上所做的那样,函数式编程正在进入Java。 协程将最终跟随套件。 我建议您查看Java路线图以获取更多信息。
请参阅进程,线程,绿色线程,原型线程,纤维,协程:有何区别? 以获得涵盖协程和其他概念的更详尽的答案。
另请参阅使用协程与线程时的吞吐量差异,讨论使用协程而不是多个线程来实现生产者消费者问题的实现。
-
+1为干净答案:)
-
谁说协程必须在单个线程上运行? 协程仅仅是一种构造。 它们本身与整个程序的并发无关。 这整个问题就像问"我可以用蹦床代替这只鸭子吗"。
-
@BenjaminGruenbaum那不是我所说的。 除非我们在多线程上下文中使用协程,否则它们将不会通过魔术运行多线程。 协程不能替代线程库提供的多线程功能。
-
@BenjaminGruenbaum请参阅我添加的参考资料,以了解鸭子如何享受在蹦床上跳跃:-)