• 并发流程控制手段
    • CountDownLatch
    • CyclicBarrier
    • Semaphore
  • 线程间数据交换
    • Exchanger

      CountDownLatch

  1. 类似场景
    1. main进程中启动子线程,等待子线程执行完成后,main再执行
    2. 可以使用 join()
  2. join()的执行原理

    1. 分清两个线程,调用join的线程和当前执行线程。
    2. 当前执行线程 当join的线程处于存活状态会一致 wait(0)
    3. join的线程在执行完毕后,会调用notifyAll()方法是JVM中实现的。
  3. 总结

    1. 当CoutDownLatch指定的数量被消耗完后,调用await()的线程才会向下执行
    2. 不可重复使用

同步屏障CyclicBarrier

  • new CyclicBarrier(int arg):当arg个线程都调用了CyclicBarrier的await()后,所有线程才往下执行
  • new CyclicBarrier(int arg, Runnable r) :当arg个线程都调用了CyclicBarrier的await()后,先执行 r任务,所有线程继续往下执行
  • 若在聚集线程过程中的某个线程被中断,所有等待和将要等待的线程都报BrokenBarrierException
  • 每次使用完本次聚集后,可以重复使用
  • 场景介绍:一个Excel有4个sheet记录的时今年全部资金流水。需要统计每个sheet的总计。然后汇总。计算日均收入。、
    • 与CountDownLatch不同
  • CyclicBarrier可以重复使用
  • CyclicBarrier是所有线程到某个点后,再同时进行,CountDown只控制一个线程

image.pngimage.png
Barrier CountDownLatch

Semaphore

  • 应用场景:流量控制
  • 本质是信号量

    线程交换数据Exchanger

  • 用于两个线程间,A需要B的计算记过,B需要A的计算结果