Java 多线程 - 使用 Fork-Join 方法在列表中查找最大元素

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

我正在重温我在 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);
    }
}

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

最佳答案

按照 RecursiveTask 中的示例:

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

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

关于Java 多线程 - 使用 Fork-Join 方法在列表中查找最大元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29430376/

相关文章:

android - UsbDeviceConnection requestWait() native 崩溃

multithreading - 仅处理最后一个TThread任务并丢弃先前的线程

scala.concurrent.blocking - 它实际上做了什么?

java - Host 中和 Host 内部的 Jmeter API 自动化

java - 返回成本最低!

java - 如何定义我的 ItemReader : Spring batch, JPA

java - Java嵌套队列

java - 为什么Spring MVC项目中css、js不连接html?

objective-c - 我什么时候需要担心 iOS 应用程序中的线程安全?

java - 在 Java 中使用 ThreadPoolExecutor 实现动态文件传输 Controller