java - forkjointask.java invokeall(t1,t2)方法,这个方法源码为什么不使用double join()方法?

标签 java multithreading concurrency

来源:

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 to fork(); 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/

相关文章:

java - Scala:构造函数 DictionaryLemmatizer 没有足够的参数

c++ - 如果我有固定数量的相互独立的计算,多线程是否会显着提高性能?

java - Java中 "wait()"与 "sleep()"之间的区别

c++ - 防止并发使用和释放

go - 使用 channel 同步多个 goroutine

java - 如何在 netbeans 可视化编辑器中的 JFrame 中添加弹出菜单

java.lang.AssertionError : impossible Caused by: java. lang.NoSuchMethodException: 值 []

支持创建 "wizard-like"命令行应用程序的 Java 框架/库

c++ - std::condition_variable – 通知一次但等待线程被唤醒两次

http - 怎么才能激发10000个并发请求呢?