【发布时间】:2013-10-31 19:14:45
【问题描述】:
在 Lua 中遇到协程的概念后,我觉得这些似乎是编程并发软件的更好模型,我想知道为什么在 Java 中没有使用?
协同例程似乎让开发人员编写在多个函数之间跳转的代码,一次执行几个步骤,提供并发执行的错觉,就像 CPU 在多个线程之间进行时间切片一样然而,Java 协程允许开发人员决定何时跳出一个函数并开始执行另一个函数。这允许开发人员决定步骤应该有多细,即并发程度,以及何时发生上下文切换,这可以防止在延迟很关键时代价高昂的上下文切换。
【问题讨论】:
-
很难回答这些“为什么 X 不做 Y?”问题。我们通常不参与设计决策。您是否对以下问题的答案感兴趣:“使用线程模型与协同例程相比有哪些好处?”
-
当然,我会检查这个问题,谢谢。
-
@user1037729 协程提供了一种控制问题流程的方法。它们本身与并发无关(嗯..如果您实现诸如 C# 的 async/await 之类的东西,它们会提供很好的 语法糖 但那不是真正在那里工作的协程)。您的问题就像“为什么 Java 使用线程抽象而不是 for 循环”。
-
运行的线程多于核心数,因此两个或多个线程共享一个核心,这意味着这些线程的执行是分步进行的,这必须与协程会运行,所以我不会说它们有太大的不同,除非你每个核心都有一个线程。
-
协程允许“冻结”函数的执行,并在同一点或另一个点恢复。这允许多个执行线程的印象,尽管不是并发的。因此,这种比较并不像@BenjaminGruenbaum 所坚持的那样荒谬。
标签: java multithreading concurrency