gpt4 book ai didi

java - ForkJoinTask的理解

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:45 25 4
gpt4 key购买 nike

subtask.fork() 返回 ForkJoinTask<Int> 后会发生什么目的?此后多次调用 compute() 方法,但从何处以及如何调用?

我是 Java 新手,正在尝试学习 fork/join 框架的概念。我在网上看到了下面的代码。我在阅读 Java API 后知道 subtask.fork()返回 ForkJoinTask<V> 的对象,这是一个 ForkJoinTask<Int>在这种情况下。我无法理解的是那之后会发生什么?输出表明 compute()方法在此之后被调用了很多次,但是从哪里以及如何调用?

public class MyRecursiveAction extends RecursiveAction {

public static void main(String[] args) {
MyRecursiveAction mra1 = new MyRecursiveAction(100);
ForkJoinPool fjp1 = new ForkJoinPool();
fjp1.invoke(mra1);
}

private long workLoad = 0;

public MyRecursiveAction(long workLoad) {
this.workLoad = workLoad;
}

@Override
protected void compute() {

//if work is above threshold, break tasks up into smaller tasks
if(this.workLoad > 16) {
System.out.println("Splitting workLoad : " + this.workLoad);

List<MyRecursiveAction> subtasks =
new ArrayList<MyRecursiveAction>();

subtasks.addAll(createSubtasks());

for(RecursiveAction subtask : subtasks){
subtask.fork();
}

} else {
System.out.println("Doing workLoad myself: " + this.workLoad);
}
}

private List<MyRecursiveAction> createSubtasks() {
List<MyRecursiveAction> subtasks =
new ArrayList<MyRecursiveAction>();

MyRecursiveAction subtask1 = new MyRecursiveAction(this.workLoad / 2);
MyRecursiveAction subtask2 = new MyRecursiveAction(this.workLoad / 2);

subtasks.add(subtask1);
subtasks.add(subtask2);

return subtasks;
}

}

输出:

Splitting workLoad : 100
Splitting workLoad : 50
Splitting workLoad : 50
Splitting workLoad : 25
Doing workLoad myself: 12
Doing workLoad myself: 12
Splitting workLoad : 25
Doing workLoad myself: 12
Doing workLoad myself: 12
Splitting workLoad : 25
Doing workLoad myself: 12
Splitting workLoad : 25
Doing workLoad myself: 12
Doing workLoad myself: 12
Doing workLoad myself: 12

最佳答案

您需要调用 invokeAll 以便将您的工作分成两部分而不是手动进行,然后将创建 2 个新线程来“计算”您的结果,然后如果它不够小,则创建 2 个新线程,依此类推..,

您无法预测线程的执行顺序,因此每次运行此代码时消息顺序都会有所不同。

public class MyRecursiveAction extends RecursiveAction {

public static void main(String[] args) {
MyRecursiveAction mra1 = new MyRecursiveAction(100);
ForkJoinPool fjp1 = new ForkJoinPool();
fjp1.invoke(mra1);
}

private long workLoad = 0;

public MyRecursiveAction(long workLoad) {
this.workLoad = workLoad;
}

@Override
protected void compute() {

//if work is above threshold, break tasks up into smaller tasks
if(this.workLoad > 16) {
System.out.println("Splitting workLoad : " + this.workLoad);

invokeAll(new MyRecursiveAction(this.workLoad / 2), new MyRecursiveAction(this.workLoad / 2));

} else {
System.out.println("Doing workLoad myself: " + this.workLoad);
}
}

}

Java doc of ForkJoinTask

关于java - ForkJoinTask的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com