Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的连续体_Java_Continuations - Fatal编程技术网

Java中的连续体

Java中的连续体,java,continuations,Java,Continuations,Java中是否有一个很好的continuations实现 如果是这样,开销是什么样的?JVM的设计并没有考虑到这类事情,对吗?那么,这种做法是否有悖常理呢?得到了支持。还有进一步的讨论和一些示例 我不能就效率或其他方面提出建议,只能说Mortbay团队总是对这些问题保持警觉。在Jetty站点的某个地方,很可能会有关于实现权衡的讨论。如果我理解正确,我想明显的问题是在关闭实例处于活动状态时展开堆栈。我假设一种具有词汇作用域的语言在理论上可以发现一个子框架可以创建一个闭包实例,识别那些被引用的中间框

Java中是否有一个很好的continuations实现

如果是这样,开销是什么样的?JVM的设计并没有考虑到这类事情,对吗?那么,这种做法是否有悖常理呢?

得到了支持。还有进一步的讨论和一些示例


我不能就效率或其他方面提出建议,只能说Mortbay团队总是对这些问题保持警觉。在Jetty站点的某个地方,很可能会有关于实现权衡的讨论。

如果我理解正确,我想明显的问题是在关闭实例处于活动状态时展开堆栈。我假设一种具有词汇作用域的语言在理论上可以发现一个子框架可以创建一个闭包实例,识别那些被引用的中间框架,然后它可以对这些框架进行malloc,而不仅仅是将它们推到堆栈上

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

总结 我认为JVM对闭包的限制并不比一台真正的机器更大,只是它们与一般的堆栈范式作斗争,所以它们通常会受到攻击。

参见ApacheJavaFlow


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

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

玩!框架版本1.2.x还集成了异步http功能

请注意

而且。

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

此外,Scala还有一些类似的异步/等待特性:

Javaflow Play框架使用Javaflow

流行 网络工作使用

扬乌姆 JVM中的JVM,实现尾部调用/延续

Scala 2.8

码头 重试请求

协同程序

jconts

jyield

基利姆

ATCT

另一个由Matthias Mann设计的图书馆:


自Java 8以来,现在有一个类支持延续和更多功能性/反应性编程方法

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

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
}
public CompletableFuture下载和大小(字符串imageUrl,int-width,int-height){
返回可完成的未来
.SupplySync(()->下载图像(图像URL))
.然后应用同步(x->调整图像大小(x,宽度,高度));
}
私有图像下载图像(字符串url){
//TODO从给定url下载图像。。。
}
专用图像大小图像(图像源、整型宽度、整型高度){
//TODO将图像大小调整为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

});
CompletableFuture-imagePromise=下载量和大小(“http://some/url", 300, 200);
imagePromise.thenAccept(图像->{
//在映像任务成功完成时执行
//对图像做些什么
});

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

使用Matthias Mann的java实现提供更高级别的功能,如Erlang-like和Go-like协程和

本手册中有许多基准测试和详细介绍

还有一个名为的随时可用的集成,旨在帮助轻松构建基于后台延续机制的高性能web服务

Quasar还提供了一个很好的Kotlin API,该API在最近的JetBrains网络研讨会上得到了展示

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

另见


更新

类星体的经验后来被用作java 11中的JavaM. 它现在正在运行,并且已经有了一个可用的alpha。

也考虑一下

它通过可能更高的performant()实现,并且可以在后台使用任何异步执行器,如ForkJoinPool或

随身携带


注意一些错误和陷阱。

Jetty continuation实现似乎与其Servlet容器捆绑在一起,因此我认为这对我没有帮助。Jetty continuation在编程语言意义上不是真正的continuation。这只是重新触发请求处理的一个技巧。另请参阅相关内容。另请参阅有关continuations实现的问题
CompletableFuture
只是很好地包装和使用它们的可能方法之一。这个概念验证库的一个分支被用于功能更丰富、更成熟的框架中。