Java中是否有很好的连续实现?
如果是这样,那么开销是多少? JVM的设计并没有考虑到这些,对吧?这种情况会不会出现问题呢?
答案 0 :(得分:12)
参见Apache Javaflow http://commons.apache.org/sandbox/javaflow/
这是Java正在开发的唯一延续包。另一个,RIFE,我不确定它处于哪个状态。
答案 1 :(得分:10)
Javaflow http://commons.apache.org/sandbox/javaflow/ Play框架使用Javaflow http://blog.heroku.com/archives/2011/8/29/play/
RIFE http://www.artima.com/lejava/articles/continuations.html WebWork使用。
JauVM http://jauvm.blogspot.com/2005/07/so-what-does-it-do.html JVM中的JVM实现尾调用/继续
Scala 2.8 http://www.scala-lang.org/node/2096
茧 http://cocoon.apache.org/2.1/userdocs/flow/continuations.html http://wiki.apache.org/cocoon/RhinoWithContinuations
码头 http://docs.codehaus.org/display/JETTY/Continuations 重试请求。
协程 http://code.google.com/p/coroutines
jconts https://github.com/idubrov/jconts
jyield http://code.google.com/p/jyield
奇勒姆 http://www.malhar.net/sriram/kilim/thread_of_ones_own.pdf
答案 2 :(得分:7)
Jetty有continuation支持。在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)
播放!框架版本1.2.x也有support for continuations与async http goodies集成。
请注意Play 1.2.x continuations only work with the inbuilt Netty server。
答案 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)
它是implemented,可能是性能更高的CPS transformations(still stackful),可以使用ForkJoinPool或Quasar integration之类的任何异步执行程序。
当心一些tooling和reflection的陷阱。
答案 9 :(得分:0)
Scala也在JVM上运行。所以它可能是相关的。
What are Scala continuations and why use them?
此外,Scala有点类似async / await功能:
答案 10 :(得分:0)
Matthias Mann的另一个图书馆: