来源:
public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
t2.fork();
t1.invoke();
t2.join();
}
为什么不使用:
public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
t1.fork();
t2.fork();
t1.join();
t2.join();
}
最佳答案
根据the documentation for ForkJoinTask
:
Method
invoke()
is semantically equivalent tofork(); join()
but always attempts to begin execution in the current thread.
因此,带有 invoke()
的版本与您的版本执行相同的操作,但不是将两个作业传递给两个不同的线程,而是将 t2
传递给另一个线程并尝试处理 t1 本身。这样传递的次数更少,涉及的线程也更少。
在您的版本中,当前线程除了等待 fork()
完成这两个任务之外什么都不做。
关于java - forkjointask.java invokeall(t1,t2)方法,这个方法源码为什么不使用double join()方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227378/