保证线程池的任务全部执行完才能继续执行其他任务
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add(i);
}
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
CountDownLatch test = new CountDownLatch(20);
list.stream().forEach(item -> {
Callable callable = new Callable<Long>() {
@Override
public Long call() throws Exception {
try {
Thread.sleep(1000);
System.out.println(item);
} catch (Exception e) {
e.printStackTrace();
} finally {
//这个不管是否异常都需要数量减,否则会被堵塞无法结束
test.countDown();
}
return test.getCount();
}
};
poolExecutor.submit(callable);
});
// 保证线程池中的所有的线任务都完成后,主线程才会继续向下执行;
test.await();
// 关闭线程池
poolExecutor.shutdown();
System.out.println("------over----");