模拟多线程并发访问

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


    }

}

如有不正之处,还请留言。谢谢

猜你喜欢

转载自blog.csdn.net/qq_38214630/article/details/84874304
今日推荐