模擬多線程併發訪問

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();
        }


    }

}

 

如有不正之處,還請留言。謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章