CountDownLatch
这个类是一个同步辅助类,使用的场景就是允许多个线程或者其他事务等待一个线程或事务结束后才可以执行自己其他的任务。
打个比方:
8人赛跑,如果让我们做一个排名及时间统计的程序,我们必须要考虑到最后一个人跑完,程序才可以结束并统计结果。
如果纯用线程,我们的计时器必须判断8个线程那个结束了,是不是都结束了,这个我们要定义很多变量来记录
这就体现出了CountDownLatch的好处了
实现代码:
package com.sky;
import java.util.concurrent.CountDownLatch;
public class RunDemo implements Runnable{
public int id = 0;
public CountDownLatch beginsingla = null;
public CountDownLatch endsingla = null;
public RunDemo(int id, CountDownLatch begin, CountDownLatch end){
this.beginsingla = begin;
this.id =id;
this.endsingla = end;
}
public void run() {
try {
beginsingla.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(id+"--> go,go,go!!!!");
System.out.println("Runner "+id+ " done!!");
endsingla.countDown();
System.out.println("Runner "+id+ " do some nother!");
}
public static void main(String[] args) {
//开始口令,等待beigin.countdown()口令
CountDownLatch begin = new CountDownLatch(1);
//开始后8个都结束,end 才能起来
CountDownLatch end = new CountDownLatch(8);
for(int i=0; i<8; i++){
//8个线程等begin
new Thread(new RunDemo(i, begin, end)).start();
}
System.out.println("ready?");
//begin开始了
begin.countDown();
try {
//end等所有的都countdown后才开始
end.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("The work is done!!");
}
}
其实就是一个countdown对象等待8个countdown的事情,这个类对与 一组线程做完之前,另一个或一组线程在等待的场景有很好的作用
第一次发帖,语言不严谨,勿怪!!!
8人赛跑,如果让我们做一个排名及时间统计的程序,我们必须要考虑到最后一个人跑完,程序才可以结束并统计结果。
实现代码:
import java.util.concurrent.CountDownLatch;
public int id = 0;
public CountDownLatch beginsingla = null;
public CountDownLatch endsingla = null;
public RunDemo(int id, CountDownLatch begin, CountDownLatch end){
this.beginsingla = begin;
this.id =id;
this.endsingla = end;
}
public void run() {
try {
beginsingla.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(id+"--> go,go,go!!!!");
System.out.println("Runner "+id+ " done!!");
endsingla.countDown();
System.out.println("Runner "+id+ " do some nother!");
}
public static void main(String[] args) {
//开始口令,等待beigin.countdown()口令
CountDownLatch begin = new CountDownLatch(1);
//开始后8个都结束,end 才能起来
CountDownLatch end = new CountDownLatch(8);
for(int i=0; i<8; i++){
//8个线程等begin
new Thread(new RunDemo(i, begin, end)).start();
}
System.out.println("ready?");
//begin开始了
begin.countDown();
try {
//end等所有的都countdown后才开始
end.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("The work is done!!");
}
}
其实就是一个countdown对象等待8个countdown的事情,这个类对与 一组线程做完之前,另一个或一组线程在等待的场景有很好的作用