Java中的延续

时间:2011-09-17 17:43:49

标签: java continuations

我正在寻找最近在Java中展示延续的工作。我在这里遇到same question,但它可以追溯到一年或两年。

有一些工作,例如Apache的JavaFlowRIFE Continuations(我现在无法以任何理由下载)。另外还有blog post提到了JDK的支持,但似乎支持将延伸到Java 8.我还认为在recent Scala版本中也引入了延续。

我正在寻找Java中的实现,提出了continuation概念。并且,我不是在寻找具有延续传递风格(CSP)的作品。

我要感谢你可能知道的任何其他工作。

4 个答案:

答案 0 :(得分:2)

我觉得这篇文章很有意思:

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

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

相比之下,MLVM project寻求在VM中本地支持它们。还有Avian,它同时支持continuations和尾调用优化。

答案 1 :(得分:1)

从您的帖子中不清楚为什么JavaFlow无法满足您的需求。 JYeild是另一个库,我在尝试像JYeild这样的项目之前,先从一个Apache项目开始,但支持较少。

答案 2 :(得分:0)

我们最近为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;
    }
}

还提供了一个更高级别的工具(称为Task),它可以自动调度,例如因为网络数据包到达或文件读取完成

答案 3 :(得分:0)

Checkout最近在Kotlin

中发布了对coroutines的实验性支持 下面的

For example代码段显示Koltin中的 coroutines 实际上是轻量级线程。创建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个任务。

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