首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java多线程-使用Fork-Join方法在列表中查找max-element

Java多线程-使用Fork-Join方法在列表中查找max-element
EN

Stack Overflow用户
提问于 2015-04-03 18:25:13
回答 1查看 941关注 0票数 1

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

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

您将如何处理此问题?您还会考虑哪些其他多线程解决方案?

EN

回答 1

Stack Overflow用户

发布于 2015-04-03 22:43:21

按照RecursiveTask中的示例操作:

代码语言:javascript
复制
dt1.fork()
return dt2.compute() + dt1.join()

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

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

https://stackoverflow.com/questions/29430376

复制
相关文章

相似问题

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