在 Java 中可以这样做:
CompletableFuture<Integer> e = new CompletableFuture<Integer>();
e = e.thenApply(x -> x * 2);
e.complete(12);
在这种情况下,thenApply
中的函数将在调用 e.complete
的线程中运行,请参阅 thenApply
在 Scala 中,我注意到 future 的所有操作函数都有一个 ExecutionContext 作为参数,所以我假设 map (与 thenApply 的作用相同)将向执行上下文发送另一个任务。
如何使用非异步方法获得与 Java CompletableFuture 相同的行为?
最佳答案
是的,原则上这是可能的。事实上,scala 的 ExecutionContext(与 java 的线程池相反)抽象了代码的运行位置,并且不会强制您将其调度到某个线程池的线程上。相反,它也可能是当前线程。这通常被称为简化的执行上下文。
但是,在实现此操作之前,您应该真正确定自己知道自己在做什么并且确实需要它。事实上,play框架已经决定不公开它,因为用它太容易搬起石头砸自己的脚:
So... given that trampoline is not widely known and won't lead to performance advantages for users, closing.
来源:https://github.com/playframework/playframework/issues/6390
类似的讨论发生在 scala-interals 邮件列表上,争论的焦点是是否向 scala 标准库添加一个。最后,保留意见是相似的:
We have hesitated in exposing it as a general thing since it can very easily wreak having for synchronous implementations.
来源:https://groups.google.com/forum/#!msg/scala-internals/QgtKugpqUlk/llVXveEuFAAJ
另请注意,如果您正在编写性能敏感/并发代码,则还有一些替代实现可能会有所帮助,例如 monix:https://monix.io/api/3.0/
关于multithreading - 是否可以让 scala Future 在同一个线程中执行映射操作,就像 Java CompletableFuture 一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47638865/