递减计数门闩CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作。
相当于是一个门栓,一开始是关闭的,所有希望通过该门的线程都需要等待,等待计数器变为0后,门栓打开,等待的所有线程都可以通过,它是一次性的,打开后就不能再关上了。
CountDownLatch里有一个计数,这个计数通过构造方法进行传递:
1 | public CountDownLatch( int count) |
多个线程可以基于这个计数进行协作,它的主要方法有:
1 2 3 | public void await() throws InterruptedException public boolean await( long timeout, TimeUnit unit) throws InterruptedException public void countDown() |
await检查计数是否为0,如果大于0,就等待,await可以被中断,也可以设置最长等待时间。countDown检查计数,如果已经为0,直接返回,否则减少计数,如果新的计数变为0,则唤醒所有等待的线程。
要实现主线程等待所有线程完成操作,最简单的做法是使用join()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class JoinCountDownLatchTest { public static void main(String[] args) throws InterruptedException { Thread parser1 = new Thread( new Runnable() { @Override public void run() { } }); Thread parser2 = new Thread( new Runnable() { @Override public void run() { System.out.println( "parser2 finish" ); } }); parser1.start(); parser2.start(); parser1.join(); parser2.join(); System.out.println( "all parser finish" ); } } |
join用于让当前执行线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待。
在JDK 1.5之后的并发包中提供的CountDownLatch也可以实现join的功能,并且比join的功能更多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class CountDownLatchTest { static CountDownLatch c = new CountDownLatch( 2 ); public static void main(String[] args) throws InterruptedException { new Thread( new Runnable() { @Override public void run() { System.out.println( 1 ); c.countDown(); System.out.println( 2 ); c.countDown(); } }).start(); c.await(); System.out.println( "3" ); } } |
CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。
当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,只需要把这个CountDownLatch的引用传递到线程里即可。
参考: Java编程的逻辑 19.3 倒计时门栓CountDownLatch
Java并发编程的艺术 8.1 等待多线程完成的CountDownLatch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-01-26 Integer和Long中的享元模式
2021-01-26 String中的享元模式
2018-01-26 js 打开标签