【问题标题】:Continuations in Java [closed]Java中的延续[关闭]
【发布时间】:2011-11-19 09:03:24
【问题描述】:

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

有一些作品,例如 Apache 的JavaFlowRIFE Continuations(我现在无法下载)。还有一个 blog post 提到了 JDK 中的支持,但似乎支持将扩展到 Java 8。我还认为 recent Scala 版本中也引入了延续。

我正在寻找呈现延续概念的 Java 实现。而且,我不是在寻找呈现延续传递风格(CSP)的作品。

我会感谢您可能知道的任何其他工作。

【问题讨论】:

  • 我编辑了帖子,现在清楚了吗?
  • 在 Java 中,通常有比使用协程或延续更好的方法来解决问题。这部分是因为 Java 不支持它。
  • @PeterLawrey 好吧,我可能不完全同意你的看法,因为他们正在为 JDK 8 计划这个编程功能。而且,在多核编程和暂停一些代码方面,似乎需要继续。如果我错了,请纠正我。
  • Continuation 很有用,可能会包含在 Java 8 中。但是我认为它们的主要好处是您可以控制的轻量级线程。由于您拥有更多内核,因此实际上更容易将硬件和线程扔到问题上。

标签: java continuations


【解决方案1】:

从您的帖子中不清楚为什么 JavaFlow 不能满足您的需求。 JYeild 是另一个库,我会先从 Apache 项目开始,然后再尝试支持较少的 JYeild 之类的项目。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      For example 下面的代码 sn-p 表明,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 个任务。

      文档中有更多很酷的示例。

      【讨论】:

      • 请在此处包含链接中答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
      猜你喜欢
      • 2010-11-30
      • 2019-12-07
      • 1970-01-01
      • 2016-07-09
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多