模拟多线程并发访问

 

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


    }

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值