项目场景:
需求:要求主线程在所有子线程执行完毕后再执行主线程
例:主线程得到所有子线程返回结果后进行处理
解决方案:
awaitTermination()配和shutdown()使用实现主线程等待线程池关闭再执行
在主线程内使用shutdown()使主线程挂起。 通过调用awaitTermination(long timeout, TimeUnit unit)。 timeout表示间隔多少单位时间监听一次,unit表示时间单位。 如果awaitTermination返回false即表示线程池还未关闭。 如果awaitTermination返回ture则表示线程池关闭,可以执行主线程。
实例:
//创建短任务类
public static class ShortTask implements Callable{
@Override
public Object call() throws Exception {
System.out.println("执行短任务");
return null;
}
}
//创建长任务类
public static class LongTask implements Callable{
@Override
public Object call() throws Exception {
System.out.println("执行长任务");
TimeUnit.SECONDS.sleep(5);
return null;
}
}
public static void main(String[] args) throws InterruptedException{
//创建线程池
ExecutorService es = Executors.newScheduledThreadPool(4);
//执行子线程
es.submit(new ShortTask());
es.submit(new ShortTask());
es.submit(new LongTask());
es.submit(new ShortTask());
//主线程挂起
es.shutdown();
/**
* awaitTermination()返回false即表示线程池还未关闭
* awaitTermination()返回true即表示线程池还关闭
* */
while(!es.awaitTermination(3,TimeUnit.SECONDS)){
System.out.println("线程池没有关闭");
}
//继续执行主线程
System.out.println("线程池关闭了");
}
本文介绍如何利用Java线程池的awaitTermination方法配合shutdown方法,实现在主线程中等待所有子线程执行完毕后再继续执行主线程的方法。
5304





