【问题标题】:Why does Java use a thread abstraction instead of co-routines? [closed]为什么 Java 使用线程抽象而不是协程? [关闭]
【发布时间】:2013-10-31 19:14:45
【问题描述】:

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

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

【问题讨论】:

  • 很难回答这些“为什么 X 不做 Y?”问题。我们通常不参与设计决策。您是否对以下问题的答案感兴趣:“使用线程模型与协同例程相比有哪些好处?”
  • 当然,我会检查这个问题,谢谢。
  • @user1037729 协程提供了一种控制问题流程的方法。它们本身与并发无关(嗯..如果您实现诸如 C# 的 async/await 之类的东西,它们会提供很好的 语法糖 但那不是真正在那里工作的协程)。您的问题就像“为什么 Java 使用线程抽象而不是 for 循环”。
  • 运行的线程多于核心数,因此两个或多个线程共享一个核心,这意味着这些线程的执行是分步进行的,这必须与协程会运行,所以我不会说它们有太大的不同,除非你每个核心都有一个线程。
  • 协程允许“冻结”函数的执行,并在同一点或另一个点恢复。这允许多个执行线程的印象,尽管不是并发的。因此,这种比较并不像@BenjaminGruenbaum 所坚持的那样荒谬。

标签: java multithreading concurrency


【解决方案1】:

协程功能强大,但不会取代成熟的多线程应用程序,因为协程在单线程上运行。因此,当需要 CPU 密集型任务时,它们不会使用多个内核。我认为它们代表了一种互补的范式,而不是一种相互竞争的范式。正如在 .Net 平台上所做的那样,函数式编程正在向 Java 迈进。协程最终将效仿。我建议您查看 Java 路线图以获取更多信息。 请参阅 Processes, threads, green threads, protothreads, fibers, coroutines: what's the difference? 以获得涵盖协程和其他概念的更详细的答案。 另请参阅Throughput differences when using coroutines vs threading,它讨论了使用协程而不是多线程来实现生产者消费者问题。

【讨论】:

  • +1 以获得干净的答案:)
  • 谁说协程必须在单线程上运行?协程只是一个构造。它们本身与整个程序的并发性无关。这整个问题就像在问“我可以用蹦床代替这只鸭子吗”。
  • @BenjaminGruenbaum 这不是我说的。除非我们在多线程的上下文中使用协程,否则它们不会神奇地运行多线程。协程不能替代线程库提供的多线程功能。
  • @BenjaminGruenbaum 查看我添加的参考资料,了解鸭子如何喜欢在蹦床上跳跃 :-)
猜你喜欢
  • 2012-04-11
  • 2020-07-06
  • 2011-10-25
  • 2013-09-21
  • 2014-07-23
  • 2012-08-20
  • 2017-03-14
  • 2018-09-18
  • 2013-08-12
相关资源
最近更新 更多