【发布时间】:2019-09-27 12:40:00
【问题描述】:
所以我要做的是使用 Fork/Join 池对 ArrayList 进行排序。我将用于排序的算法无关紧要:我只是在这里选择了一个随机算法。重要的是我应该如何使用带有 fork/join 池的递归任务,以便 ArrayList 将继续拆分,直到 ArrayList 大小达到某个数字(如 1000),然后它将执行排序,然后它将重新加入一个数组列表。 这是我的代码:
作业5
public class assignment5 {
ArrayList<Integer> numbers = new ArrayList<>();
//lets say this arraylist is full with random numbers
public void run(){
Instant start = Instant.now();
MyRecursiveTask myRecursiveTask = new MyRecursiveTask(numbers);
ArrayList<Integer> mergedResult = ForkJoinPool.invoke(myRecursiveTask);
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println("Seconds: " + duration.getSeconds());
}
}
在这里的 assignment5 给了我错误
ForkJoinPool.invoke(myRecursiveTask);
它说非静态方法调用不能从静态内容中引用
我的递归任务
private List<Integer> numbers;
protected List<Integer> compute() {
//numbers here is the same as in assignment 5
//if work is above threshold, break tasks up into smaller tasks
if(this.numbers.size() > 1000) {
System.out.println("Splitting workLoad : " + this.numbers.size());
List<MyRecursiveTask> subtasks = new ArrayList<MyRecursiveTask>();
subtasks.addAll(createSubtasks());
for(MyRecursiveTask subtask : subtasks){
subtask.fork();
}
for(MyRecursiveTask subtask : subtasks) {
subtask.join();
}
return numbers;
} else {
System.out.println("Doing workLoad myself: " + this.numbers.size());
bubbleSort(numbers);
}
return numbers;
}
private List<MyRecursiveTask> createSubtasks() {
List<MyRecursiveTask> subtasks = new ArrayList<MyRecursiveTask>();
List<Integer> list1 = numbers.subList(0,numbers.size()/2);
List<Integer> list2 = numbers.subList(numbers.size()/2, numbers.size());
MyRecursiveTask subtask1 = new MyRecursiveTask(list1);
MyRecursiveTask subtask2 = new MyRecursiveTask(list2);
subtasks.add(subtask1);
subtasks.add(subtask2);
return subtasks;
}
public void bubbleSort(List<Integer> numbers){//bubble sort alg here}
}
【问题讨论】:
-
"over here on invoke it give me error" - 如果您遇到错误,请在您的问题中包含有关该错误的详细信息。
-
请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。
-
并提示:阅读stackoverflow.com/questions/504103/… ...您绝对不希望在测量性能时出现任何print语句。这些印刷品“相当”昂贵,并且持续时间可能有很大差异。以某种方式“使用”该操作的结果(因此:打印它)可能是个好主意,但这应该发生在您获得第二个时间戳之后!
标签: java recursion arraylist forkjoinpool