首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分而治之基本情况的迭代Fork-Join

分而治之基本情况的迭代Fork-Join
EN

Stack Overflow用户
提问于 2014-03-21 14:22:49
回答 1查看 461关注 0票数 6

我有一个递归的分而治之算法,在开始除法之前需要两个计算密集型的基本情况任务。最初的基本情况是独立的任务,所以我想并行执行它们。在基本情况之后,除法使用0到1之间的不同输入运行相同的任务,并根据输出决定是否再次拆分。我通过创建一个伪装递归的任务包装器对象来实现基本用例,但这感觉就像是一个杂乱无章的东西,如下所示:

代码语言:javascript
复制
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;
    }
}

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

这是我的第一篇StackOverflow帖子,所以请原谅任何格式或协议错误。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2014-03-21 21:50:20

人们使用这个框架的方式从来没有让我感到惊讶。简而言之:这个框架是为了处理平衡树结构(D.A.G)而设计的,当你将它用于其他方面时,就会出现问题。您正在处理的不是平衡树。

Java需要的是一个通用的并行引擎,但它拥有的是这个框架。所以,你已经尽你所能了。如果它能工作,那就好。我在Java7中看不到任何替代方法,但我会更深入地研究。我想知道在分析器(比如visualVM)下这是如何执行的。因为我没有intensiveTask类,所以我没有办法继续。Java7中的join()创建“延续线程”,这可能会真正影响应用程序。让我们知道分析器说了什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22551691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档