当前位置: 首页 > 面试题库 >

Java中可用的协程库

万俟渊
2023-03-14
问题内容

我想在Java中做一些事情,如果使用并发例程编写,这些事情会更清楚,但是对于那些全功能线程来说,这是严重的过度杀伤力。答案当然是协程的使用,但是标准Java库中似乎没有协程支持,Google对其进行了快速介绍,在这里或那里带来了诱人的提示,但没有实质性提示。

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

  • JSIM有一个协程类,但是它看起来很笨重,并且看起来有点线程化。这样做的目的是减少完整线程的复杂性,而不是增加复杂性。此外,我不确定该类是否可以从库中提取并独立使用。
  • Xalan有一个协程集合类,它可以执行类似协程的工作,但是如果可以从整个库中有意义地提取出来的话,这又是一个疑问。它看起来也像是作为严格控制的线程池形式实现的,而不是作为实际的协程实现的。
  • 有一个Google Code项目看起来像我所追求的,但如果有的话,它看起来比使用线程更重。我基本上对某些需要软件在运行时动态更改JVM字节码以完成其工作的东西感到不安。这看起来像是过度杀伤力,并且会引起比协程所能解决的更多问题。此外,它似乎并没有实现整个协程概念。通过我的浏览,它提供了yield仅会返回给调用者的功能。适当的协程可以yield将控制权直接转移到任何已知的协程。基本上,这个库虽然重量级且令人恐惧,但它只为您提供对迭代器的支持,而不是完全通用的协程。
  • 在形势大好名为协程的Java失败,因为它是一个平台特定的(显然是在利用JNI)解决方案。

这就是我所发现的全部。

我知道达芬奇机器中对协程的本机JVM支持,并且我也知道执行此操作的JNI延续技巧。但是,对于我来说,这些并不是真正好的解决方案,因为我不必控制我的代码将在哪个VM或平台上运行。(实际上,任何字节码操作系统都会遇到类似的问题,例如,最好是使用纯Java。运行时字节码操作会限制我在Android上使用它。)

那么有人有指针吗?这有可能吗?如果没有,在Java 7中有可能吗?

编辑添加:

只是为了确保避免混淆,这是 与_我的另一个 _相关的 问题,但并非相同。为了避免不必要地重新发明轮子,该人正在寻找一种
现有的 实现方式。另一个问题是一个问题,如果该问题无法解决,将如何在Java中实现协程。目的是在不同的线程上保留不同的问题。

进一步编辑以添加:

该答案被选中。但是,需要进行一些评论。所指向的库不是协程库,因此从技术上讲它不能回答我的问题。话虽这么说,但是与上面链接的Google
Code项目相比,它有两个优势:

  1. 两种解决方案都使用字节码操作,但是所选的库允许 静态 字节码操作,从而使其可在Android和其他不兼容的JVM堆栈中使用。
  2. Google Code项目没有完整的协同程序。尽管答案库根本不做协程,但它做的更重要:它提供了一个很好的基础工具来滚动我自己的功能齐全的协程。

问题答案:

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

无论如何,感觉就像您正在尝试使用纯C进行OOP。这是可行的,但这并不意味着您应该这样做。



 类似资料:
  • 问题内容: 这个问题与我有关Java中现有协程实现的问题有关。如我所怀疑的,如果事实证明Java中尚没有完整的协程实现,那么实现这些协程将需要什么? 正如我在该问题中所说的,我了解以下内容: 您可以将“协程”实现为后台的线程/线程池。 您可以在后台使用JVM字节码来完成棘手的事情,以使协程成为可能。 所谓的“达芬奇机” JVM实现具有使协程在无需字节码操作的情况下就可以实现的原语。 也有多种基于J

  • 最近,我通过学习CodeLabs教程学习了kotlin coroutine。经过一些实践,我想知道我是否可以用java编写相同的代码。首先,我在MyKotlinFragment中编写了一个简单的kotlin代码。kt文件如下: 在我的片段中调用了;它起作用了。 接下来,我打开了一个名为MyRoutineFragment的java文件。java在同一个项目中,但我无法让它工作。 我无法将第一个文件转

  • 我一直很难理解协同程序的错误处理,我已经通过以下步骤将其缩小到这个单元测试: > 以下是测试: 下面是测试的输出: > 为什么会这样? 我的理解是,您可以正常处理异常,并通过协同程序从中恢复 我应该如何处理例外情况? 我需要创建一个新的合作项目吗 如果我想继续使用同一个coroutineScope,我就不能抛出异常吗 我应该返回

  • 与子程序(或者说函数)一样,协程(coroutine)也是一种程序组件。Donald Knuth 曾说,子程序是协程的特例。 一个子程序就是一次函数调用,它只有一个入口,一次返回,调用顺序是明确的。但协程的调用和子程序则大不一样,协程允许有多个入口对程序进行中断、继续执行等操作。 Python2 可以通过 yield 来实现基本的协程,但不够强大,第三方库 gevent 对协程提供了强大的支持。另

  • 本文向大家介绍unity3d 可以作为协程的MonoBehaviour方法,包括了unity3d 可以作为协程的MonoBehaviour方法的使用技巧和注意事项,需要的朋友参考一下 示例 可以将三种MonoBehaviour方法制成协程。 Start() OnBecameVisible() OnLevelWasLoaded() 例如,这可用于创建仅在摄像机可见对象时执行的脚本。        

  • Tornado 中推荐用 协程 来编写异步代码. 协程使用 Python 中的关键字 yield 来替代链式回调来实现挂起和继续程序的执行(像在 gevent 中使用的轻量级线程合作的方法有时也称作协程, 但是在 Tornado 中所有协程使用异步函数来实现的明确的上下文切换). 协程和异步编程的代码一样简单, 而且不用浪费额外的线程, . 它们还可以减少上下文切换 让并发更简单 . Exampl