【问题标题】:Java's equivalent to Scala's futures?Java 相当于 Scala 的未来?
【发布时间】:2020-12-16 22:39:34
【问题描述】:

我正在寻找 Java 中与 Scala 的未来等价的东西。

我正在寻找一种构造类型,它允许我将任务 (Runnables / Callables) 提交到我选择的特定线程池,返回期货允许我链接一些逻辑(在非阻塞方式)在它完成时发送给它。像这样的:

var executor = Executors.newCachedThreadPool();
executor.submit(() -> {
  Thread.sleep(5000);
  return 666;
}.onComplete(v -> System.out.println(v));

Java 的线程池(可通过 Executors 单例获得)似乎总是返回标准 Java Futures,它只允许我调用阻塞 get()。另一方面,据我了解,CompletableFuture 更类似于 Scala 的承诺,并且不绑定到线程池。

Java 是否提供了我正在寻找的东西? Java 领域的人们如何处理这些类型的操作?

【问题讨论】:

  • 我已经读过了。我目前正在使用 Java。
  • 你能澄清一下我在寻找什么吗? CompletableFuture 是否满足您的需求?
  • 您使用的是哪个 Java 版本?

标签: java multithreading scala concurrency


【解决方案1】:

想要回调地狱?这是一个新的。

据我了解,它更类似于 Scala 的承诺,并且不依赖于线程池。

不正确。我认为 CompletableFuture 正是你想要的 :)

将使用一个默认执行器,但如果您愿意,也可以显式指定一个 - supplyAsyncrunAsync 方法具有重载,您可以在其中传入显式执行器,所有内容都在链条使用您要使用的任何未来。

CompletableFuture.supplyAsync(() -> {
    Thread.sleep(5000);
    System.out.println("Helloooo there, from stage 1!");
    return 666;
}).whenCompleteAsync((result, exception) -> {
    Thread.sleep(5000);
    System.out.println("Coming to you live from stage 2: " + result);
    // result is null if an error has occurred in stage 1.
    // exception is null if an error did not occur.
});

注意:如果您将其放入psv main,请确保在最后添加.get();否则,虚拟机将在未来有机会实际完成工作之前退出。然后,你会看到:

> Helloooo there, from stage 1!
> Coming to you live from stage 2: 666

第一个字符串在约 5 秒后出现。 10点后的第二个,然后VM退出。


请注意,它 看起来 像 java 的未来不是,嘿,未来。 java中的期货遭受回调地狱的困扰,并且没有解决“红/蓝”方法问题(这就是从异步代码调用(可能)阻塞的任何东西是一个非常有问题的错误:很难静态检测,几乎不可能进行测试,但会完全破坏您在生产中的性能。不幸的是,很难意识到您不小心做了一些阻塞的事情,并且很少有现有的 API 和库都记录它们是否这样做,和 然后承诺永远不会更改此内容,而不考虑更改向后不兼容的更新并适当地管理其版本以反映这一点)。

这些都是可以解决的问题,但并不容易:Java 将需要“异步”或类似的,并且还需要认真努力添加文档以及可能可以在编译时检查的内容,例如带有注释。

但这些都不是 java 未来的任何地方。然而,即将出现的(现在很快,最多一年或两年的时间跨度)是“Project Loom”——它向 Java 添加了轻量级线程(“纤维”):它们代表执行状态,但它们本身不能运行在另一个核心上。你可以赚几百万,没问题。然后你就写:

int priceyOp1 = doSomethingThatTakesLong();
int priceyOp2 = thisIsAlsoSlow(priceyOp1);

然后把整个东西塞进一个光纤,甚至还有一个漏斗的概念,一个线程池将意识到它当前正在运行的光纤现在被阻塞了,然后从池中捞出另一根光纤并运行一段时间。这并没有让futures完全毫无意义,但这可能意味着futures 将保持小众,并且异步/回调地狱不会很快得到解决。

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多