Iterative Fork-Join用于分治的基本情况

Ton*_*ass 6 java multithreading java.util.concurrent fork-join forkjoinpool

我有一个递归的分治算法,在开始分割之前需要两个计算密集的基本案例任务.最初的基本案例是独立的任务,所以我想并行完成.在基本情况之后,除法运行相同的任务,在0和1之间输入不同的输入,并根据输出决定是否再次拆分.我通过创建一个伪造递归的任务包装器对象来使基本案例工作,但这感觉就像一个kludge,如下所示:

public static void doSomething () {
    ForkJoinPool pool = new ForkJoinPool();
    private ArrayList<Object> al = new ArrayList<Object>();
    TaskWrapper tw = new TaskWrapper(true,-1);

    al.addAll(pool.invoke(tw));
}

@SuppressWarnings("serial")
public static class TaskWrapper extends RecursiveTask<ArrayList<Object>> {
    private ArrayList<Object> al = new ArrayList<Object>();
    private boolean arg;
    private double input;
    private Object out;

    TaskWrapper(boolean ar, double in){
        arg = ar;
        input = in;
    }

    @Override
    public ArrayList<Object> compute() {
        if (arg == false) {
            out = new Object(runIntensiveTask(input));
            al.add(out);
        }
        else {
            // Right Base Case
            TaskWrapper right = new TaskWrapper(false, 1);
            right.fork();

            // Left Base Case
            TaskWrapper left = new TaskWrapper(false, 0);
            al.addAll(left.compute());

            // Join with Right result
            al.addAll(right.join());
        }
        return al;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来完成同样的事情?

这是我的第一篇StackOverflow帖子,请原谅任何格式或协议错误.感谢您的帮助.

edh*_*ned 3

人们使用这个框架的方式从来没有让我感到惊讶。简而言之:该框架旨在处理平衡树结构(DAG),当您将其用于其他用途时,就会出现问题。您没有处理平衡树。

Java需要的是一个通用的并行引擎,但它拥有的就是这个框架。所以,你已经尽力了。如果有效的话,很好。我在 Java7 中看不到任何替代方案,但我会更深入地研究。我想知道它在探查器(例如 VisualVM)下的执行情况。由于我没有intentyTask 类,所以我无法继续.Java7 中的 join() 创建了“连续线程”,这可以真正影响应用程序。让我们知道探查器说了什么。