【问题标题】:Sorting Arraylist using Bubblesort in parallel with fork/join pool使用 Bubblesort 与 fork/join 池并行对 Arraylist 进行排序
【发布时间】: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


【解决方案1】:

ForkJoinPool.invoke()不是静态方法,但您按原样使用。

您需要创建ForkJoinPool 的实例并调用该实例的invoke。 此外,您将需要一个明确的演员来使事情按您的意愿工作(关于ArrayList)。

用这些替换为您提供“错误”的行,它会起作用!

ForkJoinPool forkJoinPool = new ForkJoinPool();
ArrayList<Integer> mergedResult = (ArrayList<Integer>) forkJoinPool.invoke(myRecursiveTask);

希望我能帮上忙!

PS:如果您还没有这样做,我邀请您阅读其他用户的 cmets,您可能会发现它们对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多