一、什么是CountDownLatch
CountDownLatch是一个计数器,它允许一个或多个线程等待其它线程完成操作。它通常用来实现一个线程等待其它多个线程完成操作之后再继续执行的操作。
常见的应用场景是开启多个线程同时执行某个任务,等到所有任务执行完再执行特定操作,如汇总统计结果。
二、代码实现
importjava.util.concurrent.CountDownLatch; importjava.util.concurrent.TimeUnit; publicclassCountDownLatchDemo { staticfinalintN=4; staticCountDownLatchlatch=newCountDownLatch(N); publicstaticvoidmain(String[] args) throwsInterruptedException { for (inti=0; i<N; i++) { newThread(newThread1()).start(); } latch.await(5000, TimeUnit.MILLISECONDS); // 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行;等待timeout时间后count值还没变为0的话就会继续执行System.out.println("数据汇总完成 ------------"); } staticclassThread1implementsRunnable { publicvoidrun() { try { System.out.println(Thread.currentThread().getName() +"开始读取数据,处理=========="); Thread.sleep(1000); } catch (InterruptedExceptione) { e.printStackTrace(); } finally { latch.countDown(); } } } }
三、打印结果
Thread-0开始读取数据,处理==========Thread-3开始读取数据,处理==========Thread-2开始读取数据,处理==========Thread-1开始读取数据,处理==========数据汇总完成------------Processfinishedwithexitcode0
四、CyclicBarrier和CountDownLatch区别
CyclicBarrier 和 CountDownLatch 都能够实现线程之间的等待。
CountDownLatch用于某个线程等待其他线程执行完任务再执行。CyclicBarrier用于一组线程互相等待到某个状态,然后这组线程再同时执行。 CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置,可用于处理更为复杂的业务场景。