java - 等待主线程直到ExecutorService的所有线程池任务完成?
问题描述
我需要主线程等到所有线程池任务完成。怎么做?例如:我有程序:
public static void main(String[] args){
ExecutorService executor = Executors.newFixedThreadPool(2);
Map<String,String> test = new HashMap<String,String>(){{
put("a","b");
put("c","b");
}};
for(String t: test.keySet()) {
executor.execute(new Runnable() {
public void run() {
for(int i=0;i<100;i++){
System.out.println("t = " + t);
}
}
})
;
}
executor.shutdown();
System.out.println("outside");;
}
在上面的代码中,我想在 ExecutorService 任务完成后总是在最后打印“outside”。
解决方案
使用 Executor 时,我们可以通过调用 shutdown() 或 shutdownNow() 方法将其关闭。虽然,它不会等到所有线程停止执行。(这就是为什么在您的代码中“外部”首先打印而不是最后打印)。
等待现有线程完成它们的执行可以通过使用awaitTermination()方法来实现,该方法阻塞线程直到所有任务完成它们的执行或达到指定的超时
改变
executor.shutdown();
至
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException ex) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
推荐阅读
- r - r 和 ggplot 不为美国或英国着色
- asp.net - .Net C# 4.5.1 中的 WebApp 不适用于 TLS 1.2
- c# - DocumentFormat.OpenXml 2.8 版在使用 MergeField 时不起作用
- serilog - 尝试使用命名空间的第一部分过滤第二个 RollingFile
- php - Zabbix REST-API 输出限制为 10 万条记录
- c++11 - 如何在 ASCII 游戏期间阻止蓝线出现在 Windows 控制台上?
- lua - local a = true print(a and false or true) 为什么无论 a==false 还是 a == true 结果总是正确的?
- kubernetes - 如何通过 Kubernetes 中的入口公开 Web 应用程序?
- unity3d - Zenject Unity3D测试场景命中“无法解析类”如何摆脱?
- reactjs - 如何在资源列表中显示列表当前过滤器