首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中可用的协同库

Java中可用的协同库
EN

Stack Overflow用户
提问于 2010-05-17 03:03:15
回答 8查看 17.4K关注 0票数 50

如果使用并发例程编写的话,我想在Java中做一些更清晰的事情,但是对于这些线程来说,完全打开线程是非常过分的。当然,答案是协同线的使用,但是在标准的Java库中似乎没有任何协同支持,一个快速的Google会在这里或那里提供诱人的提示,但是没有什么实质性的东西。

到目前为止,我发现的是:

  • JSIM有一个coroutine类,但是它看起来相当重量级,并且似乎将线程合并在一起。这样做的目的是减少全线程处理的复杂性,而不是增加它的复杂性。此外,我不确定类是否可以从库中提取并独立使用。
  • 夏兰有一个coroutine集合类,它可以执行类似coroutine的东西,但是如果可以从整个库中有意义地提取这一点,这还是值得怀疑的。它看起来也是作为一种严格控制的线程池实现的,而不是作为实际的协同。
  • 有一个Google代码项目,它看起来像我想要的,但是如果有的话,它看起来比使用线程更重要。我基本上对一些需要软件在运行时动态更改JVM字节码以完成其工作的东西感到紧张。这看上去太过分了,而且会导致比协同解决更多的问题。此外,它似乎没有实现整个协同机制的概念。通过我的一瞥,它提供了一个yield特性,它只返回给调用者。适当的协同线允许yield将控制直接转移到任何已知的协同线。基本上,这个库,重量级和可怕的,它只是给你支持迭代器,而不是完全-一般的协同。
  • 这个名字很好的Java协同机制失败了,因为它是一个特定于平台的解决方案(显然是使用JNI)。

这就是我所发现的一切。

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

有谁有指点吗?这有可能吗?如果没有,在Java 7中会有可能吗?

编辑后添加:

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

经进一步编辑后添加:

答案被选中。然而,有些评论是有道理的。指出的图书馆不是一个协同库,所以它在技术上没有回答我的问题。不过,尽管如此,与上面链接的Google Code项目相比,它有两个优势:

  1. 这两种解决方案都使用字节码操作,但是所选的库允许静态字节码操作,这使得它可以在Android和其他不兼容的JVM堆栈中使用。
  2. Google项目没有完成完全的协同工作。虽然答案的库根本不做协同,但它做了更重要的事情:它提供了一个很好的、基本的工具来滚动我自己的全功能的coroutines。
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-05-17 06:14:12

爪哇流是一个延续实现,它可能会允许您这样做。不过,它使用字节码操作。

不管怎样,这感觉就像你想用普通的C来做OOP,这是可行的,但这并不意味着你应该这么做。

票数 16
EN

Stack Overflow用户

发布于 2011-05-25 07:17:18

基利姆框架通过使用字节代码重写来实现协同。我自己也用它来实现二江中的轻量级进程,而且对于正在进行的字节码重写量来说,它非常稳定,而且速度惊人。

Kilim的协作通过使用邮箱进行交互,因此我使用该框架来建模Erlang参与者。但是,它也可以用于共享内存模型中的协同工作。

票数 11
EN

Stack Overflow用户

发布于 2011-01-14 00:58:21

你觉得这个由马蒂亚斯·曼写的续集库怎么样?为了便于讨论,我从创作者的网站上复制了正反两方面的内容。查看源代码中的测试以查看网站上的一个示例是非常重要的。

http://www.matthiasmann.de/content/view/24/26/

让我们从你得到的开始:

  • 编写简单的顺序代码--不再需要手工创建状态机。
  • 没有创建或需要线程-没有多线程同步问题
  • 没有从代码执行中创建垃圾
  • 非常小的运行时开销
  • 只更改可挂起的方法调用--对标准库(如java.util.*等)的所有调用都不会受到影响。
  • 完全序列化支持
  • 您可以将协同操作的执行状态作为游戏状态的一部分存储在保存游戏中,而无需任何其他代码。当然,这要求您在协同器中使用的类和数据类型是可序列化的。完全支持异常处理和最后块
  • 离线预处理不会减慢您的应用程序加载时间,当然,运行时检测也是可能的。
  • 非常小的运行时库-不到10 KByte (未压缩的JAR) BSD许可证

所有这些伟大的功能-你可能会要求的缺点。当然,也有一些缺点:

  • 不能挂起构造函数和静态初始化器
  • 可挂起的方法不能同步或具有同步块
  • 您需要下载ASM3库来运行检测任务。
  • 不能使用反射调用可挂起的方法

可以通过将需要使用同步的代码放入自己的方法来解决同步问题。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2846428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档