【发布时间】:2024-04-25 04:25:02
【问题描述】:
前段时间我发现了Scala Async Project。问题是:这个 async 块有什么神奇之处,不能通过普通函数(没有宏扩展)实现?
让我们看一下介绍中的第一个例子:
import ExecutionContext.Implicits.global
import scala.async.Async.{async, await}
val future = async {
val f1 = async { ...; true }
val f2 = async { ...; 42 }
if (await(f1)) await(f2) else 0
}
在上面的示例中,我没有看到任何不能用纯 Java 编写的内容。这段代码做同样的事情:
import java.util.concurrent.*;
import java.util.function.Supplier;
// First define a helper method for creating async blocks:
public static <T> ForkJoinTask<T> async(Supplier<T> supplier) {
return new RecursiveTask<T>() {
@Override
protected T compute() {
return supplier.get();
}
}.fork();
}
ForkJoinTask<Integer> future = ForkJoinPool.commonPool().submit(() -> {
ForkJoinTask<Boolean> f1 = async(() -> true);
ForkJoinTask<Integer> f2 = async(() -> 42);
if (f1.join()) {
return f2.join();
} else {
return 42;
}
});
Scala async 能做什么而 Java 不能?也许在一些更复杂的情况下?我错过了什么?
【问题讨论】:
-
我认为 Scala 中的“任何东西”都可以重写为纯 Java .. 只要有足够的时间和精力:|
-
@user2864740 和任何用 Java 编写的东西都可以在纯汇编器中重新实现 :-)
-
你觉得哪个代码更简洁?
-
不行,
async除了语法之外肯定有杀手锏。我想到的一个想法是async可以在任何线程池上工作,而不需要ForkJoinPool。
标签: java scala asynchronous async-await forkjoinpool