Java中的延续

时间:2009-09-21 18:36:33

标签: java continuations

Java中是否有很好的连续实现?

如果是这样,那么开销是多少? JVM的设计并没有考虑到这些,对吧?这种情况会不会出现问题呢?

11 个答案:

答案 0 :(得分:12)

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

这是Java正在开发的唯一延续包。另一个,RIFE,我不确定它处于哪个状态。

答案 1 :(得分:10)

答案 2 :(得分:7)

Jettycontinuation支持。在DZone进行了进一步的讨论和一些样本。

我不能就效率或其他方面提出建议,只是说Mortbay团队总是对这些问题表现出一种看法。很可能会在Jetty网站的某处讨论实施权衡。

答案 3 :(得分:2)

如果我理解正确,我认为明显的问题涉及在活动闭包实例的情况下展开堆栈。我认为一个具有词法范围的语言理论上可以弄清楚子帧可以创建一个闭包实例,识别那些引用的中间帧,然后它可以malloc那些帧而不是仅仅将它们推到栈上。

就此而言,编译器可以对引用非全局绑定对象的闭包的所有帧或所有父帧进行malloc。

摘要

我不认为JVM限制闭包只不过是真正的机器,它只是他们对抗一般的堆栈范例,所以他们通常会受到惩罚。

答案 4 :(得分:2)

如果你不介意隐式延续,Kilim是一个很好的选择。它的工作原理是处理带注释的方法并为您生成字节码的延续。显然它会做更多,因为它是一个框架,但是如果你想要线程安全延续的(优秀)性能,那么值得一看。

答案 5 :(得分:2)

从Java 8开始,现在有一个CompletableFuture<T>类,它支持continuation和更多功能/反应式编程方法。

考虑以下示例,其中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

});

答案 6 :(得分:1)

答案 7 :(得分:1)

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

Quasar使用来自Matthias Mann的java forked实现的continuations来提供更高级别的功能,例如lightweight threads,类似Erlang的actors和类似Go的协同程序和channels

Quasar Blog中有许多基准和详细介绍。

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

Quasar还提供了一个很好的Kotlin API,在最近的JetBrains网络研讨会上有特色 Quasar: Efficient and Elegant Fibers, Channels and Actors

所提到的一切都是开源的,可以免费使用。

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

<强>更新

Quasar的经验后来被用作Loom Project的基础,aims在Java 11之后的某个时候将{/ 3}直接支持JVM。

它现在位于active development之下,并且已经有一个有效的字母prototype

答案 8 :(得分:1)

还考虑Kotlin Coroutines

它是implemented,可能是性能更高的CPS transformationsstill stackful),可以使用ForkJoinPool或Quasar integration之类的任何异步执行程序。

附带方便的guided library

当心一些toolingreflection的陷阱。

答案 9 :(得分:0)

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

What are Scala continuations and why use them?

此外,Scala有点类似async / await功能:

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

答案 10 :(得分:0)