package countDownlatch;
import java.util.concurrent.CountDownLatch;
/**
* 目的:使用CountDownLatch模拟并发
*
* 案例场景: 模拟五个运动员(五个线程),裁判鸣枪开始比赛。
* @author lin.shi
* @date 2018年12月7日 下午1:39:01
* @version 1.0.0
*/
public class CountDownLatchTest {
public static void main(String[] args) {
//所有线程阻塞,然后统一开始
CountDownLatch begin = new CountDownLatch(1);//begin 相当于裁判,数量 1
//主线程阻塞,直到所有分线程执行完毕
CountDownLatch end = new CountDownLatch(5);//end 相当于运动员,数量 5
for(int i = 0; i < 5; i++){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
begin.await();//当运动员想跑的时候,就会思考 裁判有没有鸣枪。就是 begin.countDown();执行了没有
System.out.println(Thread.currentThread().getName() + " 起跑");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " 到达终点");
end.countDown();//每当有运动员到达终点,就少一个运动员在跑。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
}
try {
System.out.println("5秒后统一开始");//观察程序运行比较直观 ,设置了 5秒后开始比赛
Thread.sleep(5000);
begin.countDown();//裁判 begin 鸣枪。 这里发生的代码是:CountDownLatch begin = new CountDownLatch(1)传入的 //参数 被 减一,
//当被减到零时begin.await()方法不被阻塞,后面的代码可以执行了。就是运动员开跑。
end.await();//查看 end.countDown(); 是否被减到了零。比赛是否结束。
System.out.println("停止比赛");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
如有不正之处,还请留言。谢谢