gpt4 book ai didi

java - fork /加入 : Collecting results

转载 作者:行者123 更新时间:2023-11-30 11:26:10 26 4
gpt4 key购买 nike

我在玩 fork/join 并想到了以下示例:

App1:2 个 for 循环将一些随机数生成到 ArrayList 并将其传递给 forkMyTask (Fork):遍历 ArrayLists 并将所有数字相加,然后返回值

import java.util.ArrayList;
import java.util.concurrent.ForkJoinPool;

public class App1 {

ArrayList list = new ArrayList();

static final ForkJoinPool mainPool = new ForkJoinPool();

public App1() {
for (int i = 0; i < 10; i++) {
list.clear();
for (int j = 1000; j <= 100000; j++) {
int random = 1 + (int)(Math.random() * ((100 - 1) + 1));
list.add(random);
}
mainPool.invoke(new MyTask(list));
}
// At the end showing all results
// System.out.println (result1 + result2 + result3...);
}

public static void main(String[] args) {
App1 app = new App1();
}
}


import java.util.ArrayList;
import java.util.concurrent.RecursiveTask;

public class MyTask extends RecursiveTask<Integer> {

ArrayList list = new ArrayList();
int result;

public MyTask(ArrayList list) {
this.list = list;
}

@Override
protected Integer compute() {
for(int i=0; i<=list.size(); i++){
result += (int)list.get(i); // adding up all numbers
}
return result;
}
}

我不确定我是否在正确的轨道上。我也不知道,如何从 fork 中收集所有结果。
有人可以看看我的代码吗?

最佳答案

虽然您的代码看起来不错,但您以错误的方式使用了 ForkJoinPool。这是一个任务工具,可以拆分成独立的子任务并且可以通过多线程提高速度。

您的任务可能还不够大,无法真正从多线程中获益,但撇开这一点不谈,因为它是一个学习练习,您仍然需要将主要任务拆分为子任务,但您所做的只是计算整个阵列一次。

您可以在代码中做的事情:

  • 使用更适合的不同多线程模式。

  • fork 任务并交出数组中的开始和结束位置,然后在这些子任务完成后汇总结果。

由于您可能对后者感兴趣,下面是一个如何执行此操作的示例:

public class MyTask extends RecursiveTask<Integer> {

final ArrayList<Integer> list;
final int start, end;

public MyTask(ArrayList<Integer> list, int start, int end) {
this.list = list;
this.start = start;
this.end = end;
}

@Override
protected Integer compute() {
if (end - start > 10) { // is this task big enough to justify more threading?
final int half = (end + start) / 2;
final MyTask firstHalf = new MyTask(list, start, half);
final MyTask secondHalf = new MyTask(list, half+1, end);
invokeAll(firstHalf, secondHalf);
return firstHalf.get() + secondHalf.get();
} else {
int result = 0;
for(int i=start; i<=end; i++){
result += list.get(i);
}
return result;
}
}
}

关于java - fork /加入 : Collecting results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925820/

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