Java中的Continuations

10

我正在寻找最近有关Java中continuations的相关工作。我在这里找到了同样的问题,但已经过去一两年了。

一些工作如Apache的JavaFlowRIFE Continuations(目前无法下载),以及有一篇博客文章提到JDK中的支持,但似乎该支持将跨越到Java 8。我还知道在最近的Scala版本中也引入了continuations的概念。

我正在寻找Java实现continuations概念的工作,而且我不想要展示continuation-passing-style(CSP)的工作。

如果您知道其他的工作,我将非常感谢。


我编辑了这篇文章,现在清楚了吗? - nobeh
在Java中,通常有比使用协程或续体更好的解决问题的方法。这部分是因为Java不支持它。 - Peter Lawrey
1
@PeterLawrey 嗯,我可能不完全同意您的观点,因为他们正计划将这个编程特性用于JDK 8。就多核编程和挂起某些代码而言,似乎需要使用continuations。如果我错了,请纠正我。 - nobeh
1
续体可以很有用,也可以包含在Java 8中。然而,我认为它们的主要好处是轻量级线程,您可以控制它们。随着您拥有更多的核心,实际上更容易将硬件和线程投入问题中。 - Peter Lawrey
3个回答

1

从您的帖子中并不清楚为什么JavaFlow不能满足您的需求。JYeild是另一个库,我建议先尝试一个有Apache支持的项目,而不是像JYeild这样支持较少的项目。


0

我们最近在Kilim中添加了一流的continuations,并发布了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;
    }
}

还提供了一个更高级别的工具(称为任务),它会自动安排,例如因为网络数据包到达或文件读取完成。

0

最近发布了Kotlin中协程的实验性支持

例如下面的代码片段显示,Kotlin中的协程实际上是轻量级线程。创建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中执行所有这些10万个任务。

文档中还有许多更酷的示例。


请在此处包含答案链接的必要部分,并提供参考链接。仅有链接的答案可能会因链接页面更改而失效。 - ivpavici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接