我是Java多线程新手所以,我的问题可能不合理。请帮助我了解它是如何工作的。
ExecutorService executor = Executors.newCachedThreadPool();
List<Future<Boolean>> futures = new ArrayList<>();
for (int i = 0; i < emailAddressList.size(); i++) {
futures.add(executor.submit(new Verify(emailAddressList.get(i))));
}
executor.shutdown();
while(!executor.awaitTermination(3, TimeUnit.SECONDS));
for (int i = 0; i < emailAddressList.size(); i++) {
bufferedWriter.write(emailAddressList.get(i) + "|" + futures.get(i).get());
bufferedWriter.newLine();
}
bufferedWriter.close();
在awaitTermination循环中,我将TimeOut设置为3秒。我想在这里实现的,在这个超时时,我想终止所有已经活动至少3秒的线程。但我如何识别呢?
答案 0 :(得分:0)
它们会自动终止。你的循环没用。
你给3秒的任务终止,如果任务还没有完成,那么除了试图强行停止正在运行的线程的shutdownNow()
之外,你做不了多少。如果您认为任务需要超过三秒,请增加超时,但循环没有用。
事实上,等待所有任务终止可能毫无用处。如果结果不可用,Future.get()
将阻止,因此您可以开始循环遍历结果。当然,如果Verify
执行一些潜在的危险操作(例如长时间运行的网络操作而没有超时),这可能会阻止所有操作。但这应该在Verify
中修复,而不是在此代码中修复。