30

Java中是否有一个很好的延续实现?

如果是这样,开销是什么样的?JVM 在设计时并没有考虑到这些事情,对吧?那么这种做法是不是逆天了呢?

4

11 回答 11

13

请参阅 Apache Javaflow http://commons.apache.org/sandbox/javaflow/

它是唯一一个正在积极开发的 Java 延续包。另一个,RIFE,我不确定它在哪个州。

于 2010-09-07T02:19:55.133 回答
7

Jetty持续的支持。DZone有进一步的讨论和一些示例。

我不能就效率或其他方面提供建议,只能说 Mortbay 团队似乎总是意识到这些问题。很可能会在 Jetty 网站的某个地方讨论实现权衡。

于 2009-09-21T18:39:07.960 回答
3

从 Java 8 开始,现在有一个CompletableFuture<T>类支持延续和更多的函数式/反应式编程方法。

考虑以下示例,其中 Class 提供了一个downloadAndResize方法:

public CompletableFuture<Image> downloadAndResize(String imageUrl, int width, int height) {
    return CompletableFuture
        .supplyAsync(() -> downloadImage(imageUrl))
        .thenApplyAsync(x -> resizeImage(x, width, height));
}

private Image downloadImage(String url){
    // TODO Download the image from the given url...
}

private Image resizeImage(Image source, int width, int height){
    // TODO Resize the image to w / h
}

上述方法的用法可能如下所示:

CompletableFuture<Image> imagePromise = downloadAndResize("http://some/url", 300, 200);

imagePromise.thenAccept(image -> {
    // Gets executed when the image task has successfully completed

    // do something with the image

});
于 2015-05-09T09:19:38.017 回答
2

如果我理解正确,我认为明显的问题涉及在关闭实例处于活动状态的情况下展开堆栈。我想一种具有词法范围的语言理论上可以计算出一个子框架可以创建一个闭包实例,识别那些被引用的中间框架,然后它可以分配这些框架而不是仅仅将它们推入堆栈。

为此,编译器可以分配引用非全局绑定对象的闭包的所有帧或所有父帧。

概括

我认为 JVM 对闭包的限制并不比真正的机器多,只是它们与一般的堆栈范式作斗争,因此它们通常会受到打击。

于 2009-09-21T18:48:48.017 回答
2

如果您不介意隐式延续,Kilim是一个不错的选择。它通过处理带注释的方法并为您生成字节码中的延续来工作。显然,由于它是一个框架,它的功能要多得多,但是如果您想要线程安全延续的(出色)性能,那么值得一看。

于 2012-08-13T18:08:06.240 回答
1

玩!框架版本 1.2.x 还支持与异步 http 好东西集成的延续。

请注意,Play 1.2.x 延续仅适用于内置的 Netty 服务器

而且Play 2.x 仍然不支持 continuations

于 2012-10-19T15:34:37.153 回答
1

最近又出现了一个强大的竞争对手。

Quasar使用来自 Matthias Mann 的 java continuation实现的fork来提供更高级别的功能,例如轻量级线程、类似 Erlang 的演员和类似 Go 的协程和通道

Quasar 博客中有很多基准测试和详细介绍。

还有一个名为Comsat的即用型集成,旨在帮助轻松构建基于引擎盖下的延续机制的高性能 Web 服务。

Quasar 还提供了一个不错的 Kotlin API,该 API 在最近的 JetBrains 网络研讨会 Quasar:Efficient and Elegant Fibers, Channels and Actors中得到了展示。

提到的所有内容都是开源的并且可以免费使用。

另见http://blog.paralleluniverse.co/2015/08/07/scoped-continuations/


更新

Quasar 的经验后来被用作Loom 项目的基础,该项目旨在在 Java 11 之后的某个时间将延续支持直接引入 JVM。

它现在正在积极开发中,并且已经有了一个工作的 alpha原型

于 2016-06-13T12:32:36.587 回答
1

还要考虑Kotlin Coroutines

它是通过可能更高性能的CPS 转换仍然是可堆叠的)实现的,并且可以在后台使用任何异步执行器,例如 ForkJoinPool 或Quasar 集成

带有方便的引导

当心一些工具反射陷阱。

于 2018-08-24T22:56:27.227 回答
0

Matthias Mann 的另一个图书馆:

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

http://www.matthiasmann.de/java/Continuations/

于 2014-04-23T10:07:59.093 回答
0

Scala也在 JVM 上运行。所以它可能是相关的。

什么是 Scala 延续,为什么要使用它们?

此外,Scala 有一些类似的 async/await 特性:

http://docs.scala-lang.org/sips/pending/async.html

于 2013-12-04T06:43:00.247 回答