【问题标题】:Java ForkJoinPool not doing what I expectJava ForkJoinPool 没有达到我的预期
【发布时间】: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&lt;end;for(int i = 0; i &lt; array.length; i++) {。否则,您会将任务分成小块并执行整个数组而不是小块。
  • 使用 1000 代替 end 而不是 999。或者使用 (array, middle+1, end) 开始第二个任务并在循环中使用 i &lt;=end

标签: java multithreading join fork pool


【解决方案1】:

您的 Java 程序在 ForkJoin 任务真正开始之前就退出了。启动任务后,您需要“等待”任务完成,方法是使用invoke 而不是execute

pool.invoke(st);

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2016-09-05
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多