我正在寻找最近在Java中展示延续的工作。我在这里遇到same question,但它可以追溯到一年或两年。
有一些工作,例如Apache的JavaFlow,RIFE Continuations(我现在无法以任何理由下载)。另外还有blog post提到了JDK的支持,但似乎支持将延伸到Java 8.我还认为在recent Scala版本中也引入了延续。
我正在寻找Java中的实现,提出了continuation概念。并且,我不是在寻找具有延续传递风格(CSP)的作品。
我要感谢你可能知道的任何其他工作。
答案 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个任务。
文档中有很多很酷的例子。