gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:08:52 24 4
gpt4 key购买 nike

我正在重温我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com