Java 中可用的协程库

2022-08-31 22:12:30

我想在Java中做一些如果使用并发例程编写的东西会更清晰,但是对于这些,全开线程是严重的过度杀戮。答案当然是使用协程,但是在标准Java库中似乎没有任何协程支持,并且快速的Google会在这里或那里带来诱人的提示,但没有任何实质性的东西。

以下是我迄今为止的发现:

  • JSIM有一个协程类,但它看起来很重量级,并且似乎与点的线程混淆。这样做的目的是降低全线程的复杂性,而不是增加它。此外,我不确定该类是否可以从库中提取并独立使用。
  • Xalan 有一个协程集类,可以执行类似协程的东西,但是如果可以从整个库中有意义地提取它,那也是值得怀疑的。它看起来也是作为严格控制的线程池形式实现的,而不是作为实际的协程实现的。
  • 有一个Google代码项目看起来像我所追求的,但如果有的话,它看起来比使用线程更重量级。我基本上对需要软件在运行时动态更改JVM字节码以完成其工作的事情感到紧张。这看起来有点矫枉过正,而且会导致比协程解决的问题更多的问题。此外,它看起来并没有实现整个协程概念。通过我的浏览,它提供了一个只返回调用程序的功能。正确的协程允许 s 直接将控制权转移到任何已知的协程。基本上,这个库,重量级和可怕,尽管它是,只给你对迭代器的支持,而不是完全通用的协程。yieldyield
  • 名为Java的Coroutine失败了,因为它是一个特定于平台的(显然使用JNI)解决方案。

这就是我所发现的一切。

我知道达芬奇机器中对协程的本机JVM支持,我也知道这样做的JNI延续技巧。然而,这些对我来说并不是很好的解决方案,因为我不一定能控制我的代码将在哪个VM或平台上运行。(事实上,任何字节码操作系统都会遇到类似的问题 -- 如果可能的话,最好是这种纯Java。例如,运行时字节码操作会限制我在Android上使用它。

那么有人有任何指点吗?这有可能吗?如果没有,在Java 7中是否可行?


编辑以添加:

只是为了确保控制混乱,这是一个与我的另一个问题相关的问题,但不一样。这个正在寻找一个现有的实现,以避免不必要地重新发明轮子。另一个问题是关于如果这个问题被证明无法回答,人们将如何在Java中实现协程的问题。目的是将不同的问题保留在不同的线程上。


进一步编辑以添加:

答案被选中。然而,一些评论是有序的。指向的库不是协程库,因此从技术上讲,它没有回答我的问题。然而,话虽如此,它与上面链接的Google Code项目相比有两个优势:

  1. 这两种解决方案都使用字节码操作,但所选库允许静态字节码操作,使其可在 Android 和其他不兼容的 JVM 堆栈中使用。
  2. Google Code 项目不执行完整的协程。虽然答案的库甚至根本不做协程,但它做了更重要的事情:它为滚动我自己的全功能协程提供了一个很好的基础工具。

答案 1

Javaflow是一个延续实现,它可能会让你这样做。它使用字节码操作。

无论如何,感觉就像你试图用普通的C做OOP。这是可行的,但这并不意味着你应该这样做。


答案 2

Kilim 框架通过使用字节码重写来实现协程。我自己用它来在Erjang中实现轻量级流程,它非常稳定,并且对于正在进行的字节码重写量来说速度惊人。

Kilim 的协程通过使用邮箱进行交互,因此我使用该框架对 Erlang actor 进行建模。但它也可以用来在共享内存模型中执行协程。


推荐