【问题标题】:Java multi-threading - Find max-element in list with a Fork-Join approachJava 多线程 - 使用 Fork-Join 方法在列表中查找最大元素
【发布时间】:2015-04-03 10:25:13
【问题描述】:

我正在复习我在 Java 中的多线程技能,并使用 java.util.concurrent.ForkJoinTask 中的 RecursiveTask 实现了这种简单的分治法来查找列表中的最大元素

public static void main(String[] args){
    new Multithreading().compute();
}

public void compute(){
    Integer[] ints = {3,2,5,7,1};
    List<Integer> list = Arrays.asList(ints);

    ForkJoinPool pool = new ForkJoinPool();
    Integer result = pool.invoke(new DividerTask(list));
    System.out.println(result);
}

class DividerTask extends RecursiveTask<Integer>{
    List<Integer> list;

    public DividerTask(List list){
        this.list = list;
    }
    @Override
    protected Integer compute(){
        if(list.size() > 2){
            int mid = list.size()/2;
            List<Integer> list1 = list.subList(0,mid);
            List<Integer> list2 = list.subList(mid,list.size());

            DividerTask dt1 = new DividerTask(list1);
            dt1.fork();

            DividerTask dt2 = new DividerTask(list2);
            dt2.fork();

            Integer res1 = dt1.join();
            Integer res2 = dt2.join();

            return (res1 > res2 ? res1 : res2);
        }

        if(list.size() == 2){
            Integer res1 = list.get(0);
            Integer res2 = list.get(1);

            return (res1 > res2 ? res1 : res2);
        }

        return list.get(0);
    }
}

你会如何处理这个问题?您会考虑哪些其他多线程解决方案?

【问题讨论】:

  • 你为什么想要另一个解决方案?
  • 这在 CodeReview.SE 上会更好吗?
  • @Rich 如果它在这里关闭,那么是的。如果没有,那么它在这里的工作方式与在代码审查中一样好。

标签: java multithreading java.util.concurrent fork-join


【解决方案1】:

按照 RecursiveTask 中的示例:

dt1.fork()
return dt2.compute() + dt1.join()

您正在执行的双重连接()导致两个计算都在等待。使用 dt2.compute() 强制当前线程继续移动。

【讨论】:

  • 好的,所以在您的解决方案中,主线程将计算 dt2 并在之后等待(加入)dt1,对吧?
  • @Shady 实际上,线程一直沿着 dt2 的链向下移动,直到它到达底部,不再发生分裂。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2014-02-08
  • 2021-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2020-12-05
相关资源
最近更新 更多