gpt4 book ai didi

java - 如何对我的顺序 Java 代码进行多线程处理

转载 作者:行者123 更新时间:2023-12-01 16:44:28 25 4
gpt4 key购买 nike

我有一个Java程序,给定一个列表,对每个列表项执行一些独立处理(包括从一些HTTP资源中检索文本并将它们插入到一个独立的HashMap中),最后计算一些这些 HashMap 上的数字。主要代码片段如下所示:

    for (int i = 0; i < mylist.size(); i++) {
long startepoch = getTime(mylist.get(i).time);
MyItem m = mylist.get(i);
String index=(i+1)+"";

process1(index, m.name, startepoch, m.duration);
//adds to hashmap1

if(m.name.equals("TEST")) {
process2(index, m.name, startepoch, m.duration);
//adds to hashmap2

} else {
process3(index, m.name, startepoch, m.duration);
//adds to hashmap3
process4(index, m.name, startepoch, m.duration);
//adds to hashmap4
process5(index, m.name, startepoch, m.duration);
//adds to hashmap5
process6(index, m.name, startepoch, m.duration);
//adds to hashmap6
}
}

// then start calculation on all hashmaps
calculate_all();

由于当前此代码段是按顺序执行的,因此对于包含 500 个项目的列表可能需要 30 分钟左右。如何对代码进行多线程处理以使其更快?并且以线程安全的方式?

我试图使用ExecutorService executorService = Executors.newFixedThreadPool(10);,然后通过像下面这样包装它来将每个单个进程提交给executorService,但是问题我不知道他们什么时候完成调用 calculate_all()。所以我就没有继续了。

            executorService.submit(new Runnable() {
public void run() {
process2(index, m.name, startepoch, m.duration);
}
});

还有更好的工作思路吗?

最佳答案

but the problem was I couldn't know when they finish

当您向执行者提交某些内容时,您会得到一个包含结果(如果有)的 Future

然后,您可以从主线程调用 Future::get 来等待这些结果(或者在您的情况下只是完成)。

List<Future<?>> completions = executor.invokeAll(tasks);

// later, when you need to wait for completion
for(Future<?> c: completions) c.get();
<小时/>

您需要注意的另一件事是如何存储结果。如果您计划让任务将它们放入某些共享数据结构中,请确保使其线程安全。从 Runnable 更改为 Callable 可能更容易,以便任务可以返回结果(稍后您可以在主线程上以单线程方式合并该结果)。

关于java - 如何对我的顺序 Java 代码进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55152648/

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