用线程池时有时要满足“当线程池里的线程都执行完毕后才能进行下一步”这种业务场景,例如:当多线程操作一个文件时要保证所有线程都运行完毕才能保证文件的完整
- 使用isTerminated方法
private static void executorThreads1(List<People> peoples, List<Phone> phones) {
peoples.forEach(people -> {
//多线程运行
poolExecutor.execute(new Runnable() {
@Override
public void run() {
// TODO
});
}
});
});
poolExecutor.shutdown();
if (poolExecutor.isTerminated()) break;
}
}
- 使用CountDownLatch
private static void executorThreads2(List<People> peoples, List<Phone> phones) {
CountDownLatch count = new CountDownLatch(peoples.size());
peoples.forEach(people -> {
poolExecutor.execute(new Runnable() {
@Override
public void run() {
// TODO
});
count.countDown();
}
});
});
poolExecutor.shutdown();
//await():等待所有count都执行完毕
try {
count.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
- 使用awaitTermination方法
/** * 使用awaitTermination方法: * 当使用awaitTermination时,主线程会处于一种等待的状态,有下面两种情况发生时才会解除等待状态 * 1、等待线程池中所有的线程都运行完毕后会解除等待,继续运行 * 2、如果到了设置的超时时间,线程即使没运行完也会解除等待,继续运行 */
private static void executorThreads3(List<People> peoples, List<Phone> phones) {
peoples.forEach(people -> {
poolExecutor.execute(new Runnable() {
@Override
public void run() {
// TODO
});
}
});
});
poolExecutor.shutdown();
try {
//参数:超时时间、时间单位
poolExecutor.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
文章评论