多线程之CountDownLatch

来源:互联网 发布:tomcat能运行php吗 编辑:程序博客网 时间:2024/05/16 19:44

CountDownLatch:顾名思义为倒数计数器,主要作用是用于一个线程等待其他线程完成后执行。

其构造方法 public CountDownLatch(int count),中的count是指需要等待的线程数。

package demo.countdown;


import java.util.concurrent.CountDownLatch;


public class CountDownLatchTest {


private static CountDownLatch cd = new CountDownLatch(3);
static class ThreadA extends Thread{
String name;
public ThreadA(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread A running...."+name);
cd.countDown();
}
}

static class ThreadB extends Thread{
String name;
public ThreadB(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread B running...."+name);
cd.countDown();
}
}

static class ThreadC extends Thread{
String name;
public ThreadC(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread C running...."+name);
cd.countDown();
}
}



public static void main(String[] args) throws InterruptedException {
new ThreadA("WorkdA").start();
new ThreadB("WorkdB").start();
new ThreadC("WorkdC").start();
cd.await();
System.out.println("子线程已工作完成.....");

}
}

首先定义了一个CountDownLatch其中实例时定义了count=3,意思就是等待三个线程完成后,主线程才执行(这里的主线程就是其他或者一个线程)A B C三个线程就是子线程

子线程中调用一个countDown的方法,这个方法就是将count-1.

主线程调用await方法,将主线程阻塞在这里,直到count=0时再调用。

这里需要注意的是,如果子线程的数大于count的话,那么主线程会一直阻塞在那,这里不难理解,因为假设子线程的数是2,但是count=3,这样count永远不会是0。所以会阻塞在这里。

countDownLatch主要场景是我们实例化一些配置或者对象后,再执行我们后面的业务时,我们就可以用这个工具类来实现

原创粉丝点击