CountDownLatch
这个类使用起来比较简单.使用场景就是 你需要很多线程执行结束之后才执行最后的代码,那用这个就对了. 这个类底层是用aqs来实现的.
这类主要使用的方法
count.await();
count.countDown();
里面的API很少
结束线程await()
1.countDown
2.被阻塞的线程interrupt()

private static CountDownLatch count = new CountDownLatch(1); public static void main(String[] args) throws InterruptedException { Thread t =Thread.currentThread(); new Thread(()->{ try { Thread.sleep(2000); t.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); System.out.println("阻塞...."); count.await(); System.out.println("====="); } }
就是比如你有几个线程需要跑批你的任务你可以在countDown初始化的时候把线程数方进入
每一个线程结束的时候调用coutDown -1 等所有线程都执行结束之后.可以进行汇总
cyclicBarrier
cyclicBarrier 和countDownLatch有点相似,不过他们是不同的.
countDownLatch 是初始化一个线程数 做一个计数器的功能.相当于一个裁判,线程相当于一个一个选手.当所有选手都结束的时候,才会总的进行分数.或者其他的运算
cyclicBarrier 也有自己的初始值,只不过他的模式,是让线程直接互相等待,打一个比方,比如去聚会,需要10个人才能吃饭,但是现在来了9个人,大家都在等这第10个人来了.才开始一起吃饭.
就是有个await()方法当所有线程调用都到达这里的时候才会一起去执行下面的代码.
public static void main(String[] args) throws InterruptedException { CyclicBarrier cyclicBarrier = new CyclicBarrier(2); new Thread(()->{ try { TimeUnit.SECONDS.sleep(10); System.out.println("t1 finied "); cyclicBarrier.await(); System.out.println("t1 结束..await'"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); new Thread(()->{ try { TimeUnit.SECONDS.sleep(5); System.out.println("t2 finished "); cyclicBarrier.await(); System.out.println("t2 结束..await'"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); Thread.currentThread().join(); }
t2 finished
t1 finied
t1 结束..await'
t2 结束..await'
回调的方式

public static void main(String[] args) throws InterruptedException, BrokenBarrierException { CyclicBarrier cyclicBarrier = new CyclicBarrier(2,()->{ System.out.println("所有都结束了"); }); new Thread(()->{ try { TimeUnit.SECONDS.sleep(10); System.out.println("t1 finied "); cyclicBarrier.await(); System.out.println("t1 结束..await'"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); new Thread(()->{ try { TimeUnit.SECONDS.sleep(5); System.out.println("t2 finished "); cyclicBarrier.await(); System.out.println("t2 结束..await'"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); }