Java中的继续

我正在寻找最近在Java中呈现延续性的工作。 我在这里遇到过同样的问题 ,但是可以追溯到一两年。

有一些工作,比如Apache的JavaFlow , RIFE Con​​tinuations (我现在无法下载)。 还有一篇博客文章提到了JDK的支持,但似乎支持将跨越到Java 8.我也认为在最近的 Scala版本中也引入了延续。

我正在寻找Java中的实现来呈现continuation的概念。 而且,我不是在寻找那些呈现延续式(CSP)的作品。

我会很感激你可能知道的其他工作。

我发现这篇文章很有意思:

http://www.ccs.neu.edu/scheme/pubs/stackhack4.html

如果你读完整篇文章,你将会很好地理解在虚拟机没有帮助的情况下通过字节码操作来实现一流延续所涉及的权衡。

相比之下, MLVM项目试图在VM中本地支持它们。 Avian也支持延续和尾部呼叫优化。

从你的文章中不清楚为什么JavaFlow不能满足你的需求。 JYeild是另外一个库,我会先尝试一个Apache项目,然后再尝试像JYeild这样的项目,但是支持的不多。

我们最近添加了一流的延续到kilim并有2.0预发布。

http://github.com/nqzero/kilim

这里是一个计算XorShift(num次数)的剪辑:

public static class X2 extends Continuation implements Loop { long result; public void execute() throws Pausable { long x, y, s0=103, s1=17; while (true) { x = s0; y = s1; s0 = y; x ^= (x << 23); s1 = x ^ y ^ (x >> 17) ^ (y >> 26); result = (s1 + y); Fiber.yield(); } } public long loop(long num) { long val = 0; for (int ii=0; ii < num && !run(); ii++) val = val ^ result; return val; } } 

还提供了更高级别的设施(称为任务),其被自动调度,例如因为网络分组到达或文件读取完成

Checkout最近在Kotlin发布了协程的实验支持

例如下面的代码片段显示Koltin中的协程实际上是轻量级的线程。 创建100000个普通线程很可能会导致一些严重的错误,如OutOfMemoryError,但是这个代码工作得很好:

 fun main(args: Array<String>) = runBlocking<Unit> { val jobs = List(100_000) { // create a lot of coroutines and list their jobs launch(CommonPool) { delay(1000L) print(".") } } jobs.forEach { it.join() } // wait for all jobs to complete } 

当然,这里没有什么大的魔力,Kotlin会在编译时为你生成一些代码,这些代码将执行ForkJoinPool中的所有这100000个任务。

文档中有很多很酷的例子。

Interesting Posts