首先,你传递的时间awaitTermination
是一个近似值,它应该总是比你完成所有任务所花费的最坏情况累积时间更多。如果它是您在这些可运行文件中进行的 Web 服务调用或 DB 调用,那么不为它们推测一些固定时间并不容易,因为它可能会根据您的站点流量而有所不同。因此,与其假设它总是会在某个确定的时间内完成,不如在开始使用这些结果之前等待所有这些可运行文件完成。
如果您不能CompletableFuture
从 Java8 使用,并且需要等到所有提交到池的可运行文件都执行完毕,那么您可以像下面这样使用invokeAll
。ExecutorService
invokeAll
将阻塞主线程,直到所有提交的可调用对象都被执行。
// removing try-catch blocks for brevity
ExecutorService service = Executors.newFixedThreadPool(2);
List<Callable<Integer>> tasks = new ArrayList<>();
tasks.add(new Callable<Integer>(){
public Integer call(){
Thread.sleep(5000);
System.out.println("thread1 coming out of sleep");
return 1;
}
});
tasks.add(new Callable<Integer>(){
public Integer call(){
Thread.sleep(10000);
System.out.println("thread2 coming out of sleep");
return 2;
}
});
List<Future<Integer>> futures = service.invokeAll(tasks);
System.out.println("back in main");
service.shutdown();
service.awaitTermination(20,TimeUnit.SECONDS);
输出 :
thread1 coming out of sleep
thread2 coming out of sleep
back in main