gpt4 book ai didi

java - 我的 ExecutorService 实现正确吗?

转载 作者:行者123 更新时间:2023-12-02 02:30:36 25 4
gpt4 key购买 nike

我是多线程新手,我正在尝试使用ExecutorService使我的程序更快。下面是 y 的实现,但是我的程序仍然运行不快。你能看一下我的代码并提出建议吗?

它基本上读取电子邮件地址列表并将其存储在 ArrayList 中。我使用 ExecutorService 并循环遍历 ArrayList 并调用 Callable 类进行一些处理并返回 boolean 值。

ArrayList<String> emailAddressList = new ArrayList<>();
ExecutorService executor = Executors.newFixedThreadPool(7);
for (int i = 0; i < emailAddressList.size(); i++) {
Future<Boolean> resultFromThread = executor.submit(new Verify(emailAddressList.get(i)));
bufferedWriter.write(emailAddressList.get(i) + "|" + resultFromThread.get());
bufferedWriter.newLine();
}

executor.shutdown();
executor.awaitTermination(3, TimeUnit.SECONDS);

================================================== =============================

public class Verify implements Callable<Boolean> {

private String email;


public Verify(String email) {
this.email = email;
}

@Override
public Boolean call() throws Exception {
Boolean result = false;
try {
result = Validator2.isAddressValid(email);
} catch (Exception e) {
}
return result;
}

}

最佳答案

在循环的每次迭代中,执行两个操作:

  1. Callable 计划与 Executor 一起运行
  2. 紧接着 - 在安排另一个任务之前 - 代码等待执行器完成刚刚提交的 Callable。
这样,所有 Callable 仍然以串行方式执行(我们等待完成一个,然后再提交另一个),而不是并行执行它们。

一个简单的解决方案可能是首先提交所有可调用对象以供执行。然后,在一个单独的循环中,等待它们完成并处理结果。这样,由于可调用对象的并行处理,性能将得到提高。

示例:

List<Future<Boolean>> futures ... ;
for (int i = 0; i < emailAddressList.size(); i++) {
futures.add(executor.submit(new Verify(emailAddressList.get(i))));
}

for (int i = 0; i < emailAddressList.size(); i++)
bufferedWriter.write(emailAddressList.get(i) + "|" + futures.get(i).get());
bufferedWriter.newLine();
}

请注意,此代码等待 Callables 按照提交给 Executor 的顺序完成。情况可能不一定如此。如果最终写入器中的地址顺序并不重要,则可以考虑完全异步处理。在 Java 8 中,这可以通过使用 CompleteableFuture 来实现。 API。

关于java - 我的 ExecutorService 实现正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47182904/

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