公众号merlinsea
- CountDownLatch
- CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
- countDownLatch.await() state>0就会一直wait
- countDownLatch.countDown() state-1操作
public class CountDownLatchDemo { public static void main(String[] args) { /** * 传入的8会赋值给CountDowmLatch内部的Sync的state */ CountDownLatch countDownLatch = new CountDownLatch(8); new Thread(()->{ try { //只有等到CountDowmLatch内部的Sync的state==0才会被唤醒 countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("800米比赛结束,准备清空跑道并继续跨栏比赛"); }).start(); for (int i = 0; i < 8; i++) { int finalI = i; new Thread(()->{ try { Thread.sleep(finalI * 1000L); System.out.println(Thread.currentThread().getName()+"到达终点"); } catch (InterruptedException e) { e.printStackTrace(); } finally { //每执行一个线程countDownLatch中的state减1 countDownLatch.countDown(); } }).start(); } } }
- CyclicBarrier
- CyclicBarrier(栅栏):表示当阻塞在这个 CyclicBarrier类上的线程达到一定数量的时候,才会同时唤醒所有阻塞在这个类上的其他线程继续向下执行。
- CyclicBarrier和CountDownLatch的区别:CyclicBarrier是一群线程一起等待,当所有线程等待就绪了才可以一起向下执行;CountDownLatch是某个线程等待其他一群线程,只有这些线程都执行完毕以后,这个等待的线程才可以执行。
public class CyclicBarrierDemo { public static void main(String[] args) { //当在这个cyclicBarrier等待的线程达到8个时,才允许线程会唤醒所有等待在cyclicBarrier上的线程继续执行 CyclicBarrier cyclicBarrier = new CyclicBarrier(8); for (int i = 0; i < 8; i++) { int finalI = i; new Thread(() -> { try { Thread.sleep(finalI * 1000L); System.out.println(Thread.currentThread().getName() + "准备就绪"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +" 开始比赛"); }).start(); } } }