Java CountDownLatch线程同步源码硬核解析
好大的月亮 人气:0场景
有时间在主线程中开启了多线程后,主线程需要等所有线程执行完毕才能return,这个时候就需要在return前拦一下,直到所有线程执行完毕。
或者,某些场景下需要多个线程同一时间执行,需要在起步的时候统一拦一下,然后收到通知再运行。
java.util.concurrent.CountDownLatch就能实现我们上面的这些需求。
CountDownLatch
CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务
代码demo
直接上demo把。
主线程等待多线程完成后返回
CountDownLatch countDownLatch = new CountDownLatch(5); for (int i = 0; i < 5; i++) { new Thread(() -> { String name = Thread.currentThread().getName(); System.out.println(name + "等待5秒" + LocalDateTime.now()); try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(name + "扣减1" + LocalDateTime.now()); countDownLatch.countDown(); }).start(); } try { countDownLatch.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("finish");
执行结果
让所有线程同一时间执行
CountDownLatch countDownLatch = new CountDownLatch(1); for (int i = 0; i < 5; i++) { new Thread(() -> { String name = Thread.currentThread().getName(); try { System.out.println(name + "准备" + LocalDateTime.now()); countDownLatch.await(); System.out.println(name + "完成" + LocalDateTime.now()); } catch (InterruptedException e) { throw new RuntimeException(e); } }).start(); } try { Thread.sleep(5000); System.out.println("link start"); } catch (InterruptedException e) { throw new RuntimeException(e); } countDownLatch.countDown();
执行结果
加载全部内容