这是我参与更文挑战的第13天,活动详情查看: 更文挑战
1、CountDownLatch使用场景
CountDownLatch是一个多线程工具类,里面的主要方法就是await和countdown
使用场景:
有五个业务线程
业务线程1,业务线程2,业务线程3、业务线程4
业务线程1和业务线程2执行到某一步之后进行等待,需要业务线程3和业务线程4里面的分别其中一个任务执行完之后,业务线程1,和业务线程2再继续执行
2、CountDownLatch的原理
CountDownLatch的原理其实,内部有一个计数器,比如业务线程1,和业务线程2需要等待3个任务执行完毕,则可以实例化一个CountDownLatch,它的初始值为3,然后业务线程1,和业务线程2,执行完分别的某一步之后分别调用CountDownLatch的await方法,业务线程1和业务线程2就会进入等待状态,业务线程3 执行完任务1之后执行CountDownLatch的countdown方法,CountDownLatch的初始值就会从3变成2,然后继续执行任务2,执行完成之后继续执行countdown方法,然后业务线程四执行完成任务3,CountDownLatch就会变成0,就会通知业务线程1和业务线程2继续执行剩下的操作。
上边说的例子有可能业务线程4先执行完,都不一定,但是他们的countdown的次数一定是3,最终CountDownLatch的初始值还是会变成0
CountDownLatch的初始值其实是线程安全的,其内部的实现原理用到了AQS,这个咱们还没学到,AQS保证了CountDownLatch的Count的安全,也就能实现标题1的业务场景
CountDownLatch的使用不一定非得一个线程进行等待,多个线程等待也是可以的,他的Count数和线程数也是没有关系的,Count的数 和执行countDown的次数是有关系的,一个线程可以多次执行countDown方法的
3、CountDownLatch使用
public class UseCountDownLatch {
static CountDownLatch latch = new CountDownLatch(6);
/*初始化线程*/
private static class InitThread implements Runnable{
public void run() {
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work......");
latch.countDown();
for(int i =0;i<2;i++) {
System.out.println("Thread_"+Thread.currentThread().getId()
+" ........continue do its work");
}
}
}
/*业务线程等待latch的计数器为0完成*/
private static class BusiThread implements Runnable{
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i =0;i<3;i++) {
System.out.println("BusiThread_"+Thread.currentThread().getId()
+" do business-----");
}
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
public void run() {
SleepTools.ms(1);
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 1st......");
latch.countDown();
System.out.println("begin step 2nd.......");
SleepTools.ms(1);
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 2nd......");
latch.countDown();
}
}).start();
new Thread(new BusiThread()).start();
for(int i=0;i<=3;i++){
Thread thread = new Thread(new InitThread());
thread.start();
}
latch.await();
System.out.println("Main do ites work........");
}
}
复制代码
CountDownLatch的使用还是很简单的哈哈哈