CountDownLatch可以理解为是一个计数器。
关于CountDownLatch类方法如下
//构造实现类,count代表计数器大小
public CountDownLatch(int count);
//线程挂起等待计数器为0
public void await();
//线程在有限时间内挂起等待计数器为0
public boolean await(long timeout, TimeUnit unit);
//计数器减一
public void countDown();
CountDownLatch底层也是通过AQS实现,我们可以把我们定义的计数器大小理解为我们同时加了几把锁,countDown每次释放掉一把锁。
例1
public class CountDownLatchDemo {
public static CountDownLatch countDownLatch = new CountDownLatch(1);
static class ThreadDemo implements Runnable{
public String name;
public ThreadDemo(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+"开始"+getDate());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
System.out.println(name+"结束"+getDate());
}
}
static class ThreadDemo1 implements Runnable{
public String name;
public ThreadDemo1(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+"开始"+getDate());
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"结束"+getDate());
}
}
public static String getDate(){
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
return dateFormat.format(date);
}
public static void main(String []args) {
Thread thread1 = new Thread(new ThreadDemo("t1"));
Thread thread2 = new Thread(new ThreadDemo1("t2"));
thread1.start();
thread2.start();
}
}
结果如下,因为t2执行了await,所以它会等待t1执行完countDown再往下执行。
t2开始2019-11-17 :11:30:26
t1开始2019-11-17 :11:30:26
t1结束2019-11-17 :11:30:28
t2结束2019-11-17 :11:30:28
例2
public class CountDownLatchDemo2 {
public static CountDownLatch countDownLatch = new CountDownLatch(1);
static class ThreadDemo implements Runnable{
public String name;
public ThreadDemo(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+"开始"+getDate());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
System.out.println(name+"结束"+getDate());
}
}
static class ThreadDemo1 implements Runnable{
public String name;
public ThreadDemo1(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+"开始"+getDate());
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"结束"+getDate());
}
}
public static String getDate(){
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
return dateFormat.format(date);
}
public static void main(String []args) {
Thread thread1 = new Thread(new ThreadDemo("t1"));
Thread thread2 = new Thread(new ThreadDemo1("t2"));
Thread thread3 = new Thread(new ThreadDemo1("t3"));
thread1.start();
thread2.start();
thread3.start();
}
}
结果如下,可以看到我们启用2个线程await,也是会等待countDown完毕才会执行。
t2开始2019-11-17 :11:43:58
t1开始2019-11-17 :11:43:58
t3开始2019-11-17 :11:43:58
t1结束2019-11-17 :11:44:00
t3结束2019-11-17 :11:44:00
t2结束2019-11-17 :11:44:00
例3
public class CountDownLatchDemo3 {
public static CountDownLatch countDownLatch = new CountDownLatch(1);
static class ThreadDemo implements Runnable{
public String name;
public ThreadDemo(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+"开始"+getDate());
countDownLatch.countDown();
countDownLatch.countDown();
System.out.println(name+"结束"+getDate());
}
}
public static String getDate(){
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
return dateFormat.format(date);
}
public static void main(String []args) {
Thread thread1 = new Thread(new ThreadDemo("t1"));
thread1.start();
}
}
可以看到可以正常执行的
t1开始2019-11-17 :11:49:03
t1结束2019-11-17 :11:49:04
例4
public class CountDownLatchDemo4 {
public static CountDownLatch countDownLatch = new CountDownLatch(1);
static class ThreadDemo implements Runnable{
public String name;
public ThreadDemo(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+"开始"+getDate());
countDownLatch.countDown();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
System.out.println(name+"结束"+getDate());
}
}
public static String getDate(){
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
return dateFormat.format(date);
}
public static void main(String []args) {
Thread thread1 = new Thread(new ThreadDemo("t1"));
thread1.start();
}
}
可以看到例4也可以正常执行的
t1开始2019-11-17 :11:51:07
t1结束2019-11-17 :11:51:07
网友评论