1.join()
如果是一个线程,可以使用此方法,多个不合适
2.CountDownLatch
此为并发计数器,每个线程结束后减一(countDown()),countDownLatch.await();//等待所有子线程执行完
3.线程池ThreadPoolExecutor的shutdown与awaitTermination方法
executor.shutdown();//只是不能再提交新任务,等待执行的任务不受影响
try {
boolean loop = true;
do { //等待所有任务完成
loop = !executor.awaitTermination(2, TimeUnit.SECONDS); //阻塞,直到线程池里所有任务结束
} while(loop);
} catch (InterruptedException e) {
e.printStackTrace();
}
service.shutdown();
while(!service.awaitTermination(2, TimeUnit.SECONDS)){
System.out.println("service not stop");
}
//或者isTerminated,如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。
executor.shutdown();//只是不能再提交新任务,等待执行的任务不受影响
while(true){
if(exe.isTerminated()){
System.out.println("所有的子线程都结束了!");
break;
}
Thread.sleep(1000);
}
ThreadPoolExecutor.getActiveCount() == 0 ?