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();
}
}
}
如有不正之處,還請留言。謝謝