CountDownLatch使用
为了实现等待所有线程池执行完之后再执行主线程的逻辑,我决定使用 AQS(AbstractQueuedSynchronizer,抽象同步框架)下的著名类 CountDownLatch 来实现此功能,具体的实现代码如下:
public static void main(String[] args) throws InterruptedException { // 创建 CountDownLatch CountDownLatch countDownLatch = new CountDownLatch(2); // 创建固定线程数的线程池 ExecutorService executorService = Executors.newFixedThreadPool(2); // 任务一 executorService.submit(new Runnable() { @Override public void run() { // do something try { // 让此任务执行 1.2s Thread.sleep(1200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("我是任务一"); countDownLatch.countDown(); } }); // 任务二 executorService.submit(new Runnable() { @Override public void run() { // do something try { // 让此任务执行 1.2s Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("我是任务二"); countDownLatch.countDown(); } }); // 等待任务执行完成 countDownLatch.await(); System.out.println("程序执行完成~"); }
以上程序执行结果如下:
从上述结果可以看出,主线程的执行是等待任务一和任务二都执行完成之后才执行的。