【发布时间】:2016-04-15 04:50:13
【问题描述】:
我只是在学习 Java 的 ForkJoinPool。为了获得更好的理解,我为自己创建了一个小例子。我希望我编写的代码能够产生一些输出,但我在控制台窗口中什么也看不到。没有错误,所以我可能会误解如何使用此服务。请忽略似乎无法准确描述该方法正在做什么的方法名称。毕竟这是临时代码。
import java.util.concurrent.RecursiveAction;
public class SortTask extends RecursiveAction {
final int THRESHOLD = 10;
int[] array;
int begin, end;
public SortTask(int[] array, int begin, int end) {
this.array = array;
this.begin = begin;
this.end = end;
}
@Override
protected void compute() {
if((end - begin) < THRESHOLD) {
for(int i = 0; i < array.length; i++) {
System.out.println(i);
array[i] = i;
}
} else {
int middle = (end - begin) / 2;
invokeAll(new SortTask(array, begin, middle), new SortTask(array, begin, middle));
merge(array, begin, end);
}
}
public void merge(int[] array, int begin, int end) {
System.out.println(array.length);
}
}
还有:
import java.util.concurrent.ForkJoinPool;
public class Main {
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors());
int[] list = new int[1000];
SortTask st = new SortTask(list, 0, 999);
ForkJoinPool pool = new ForkJoinPool();
pool.execute(st);
}
}
【问题讨论】:
-
很确定你想要
middle, end来获取第二部分:invokeAll(new SortTask(array, begin, middle), new SortTask(array, begin, middle)); -
这里可能也想要
int i=begin; i<end;:for(int i = 0; i < array.length; i++) {。否则,您会将任务分成小块并执行整个数组而不是小块。 -
使用 1000 代替
end而不是 999。或者使用(array, middle+1, end)开始第二个任务并在循环中使用i <=end。
标签: java multithreading join fork pool