警匪追击案例-思路整理

使用内容:多线程,java的继承

案例:
劫匪抢劫了银行,警察发现,然后,劫匪随后抢走了运钞车,而警察手边有三种车,警察会随机骑一辆车进行追击;
车的车速分别为:
运钞车:120,摩托车:50,公交车:100,跑车:180,
在追击过程中,运钞车会发生爆胎事件,如果爆胎,车速会降到40;
问:警察会不会追上劫匪

思路清理:
1,使用继承,建立警车父类:包含车速和车的种类两种属性;然后摩托车,公交车和跑车分别继承警车父类;另建立运钞车类:包含车速和种类以及是否爆胎的标记和爆胎时间属性,分别利用构造方法为各个属性赋值;在运钞车中,建立是否爆胎的方法,1/3概率

public boolean isBoomTie() {
        Random ran = new Random();
        int randomBoom = ran.nextInt(3);
        return randomBoom ==0 ? true : false;
    }

然后是爆胎线程:
将运钞车传入线程中,如果发生爆胎事件,就将车速调到40,并且将爆胎标记更改为真,同时将运钞车中的爆胎标记同一为真;

public class BoomTieRunable implements Runnable{
    public boolean isBoomTie=false;
    private CushCar cushCar=null;
    public BoomTieRunable(CushCar cushCar){
        this.cushCar=cushCar;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(!isBoomTie){
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            synchronized (cushCar) {
                isBoomTie=cushCar.isBoomTie();

                if(isBoomTie){
                    cushCar.speed=40;
                    cushCar.isBoomTie=isBoomTie;
                }

            }
        }

    }

}

然后是追击线程:
如果两车之间的相对距离小于等于0.说明追上了,相对距离的计算是运钞车的速度加上初始距离减去警车的速度,因为循环是时间的每次加一操作。同时为了求出运钞车爆胎时间;使用了一个标记(第一次设置爆胎时间)当设置过爆胎时间,就将状态更改为false,然后就进不来判断体,得到爆胎时间,同时调用运钞车的爆胎方法
所以,在追击线程中,要有运钞车的引用,要有第一次设置爆胎标记。同时有时间变量,以及相对距离变量,还有警车的引用

public class FollowRunable implements Runnable {
    private float relativeDistance;
    private CushCar cushCar;
    private PoliceCar policeCar;
    private float time=0;
    protected boolean isFirstSetBoomTie=true;

    public FollowRunable(float relativeDistance, CushCar cushCar,
            PoliceCar policeCar) {
        this.relativeDistance = relativeDistance;
        this.cushCar = cushCar;
        this.policeCar = policeCar;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (relativeDistance > 0) {
            synchronized (cushCar) {
                relativeDistance = cushCar.speed / 3.6f + relativeDistance
                        - policeCar.speed / 3.6f;
                time++;
                //得到爆胎时间
                /*
                 * 运钞车发生爆胎事件,同时是第一次设置爆胎,得到爆胎时的时间,
                 * 然后将第一次设置爆胎时间的标记改为false
                 */
                if(isFirstSetBoomTie&&cushCar.isBoomTie){
                    cushCar.time=time;
                    isFirstSetBoomTie=false;
                }

                if(time>35*3600){
                    System.out.println("未追击成功");
                    break;
                }
                System.out.println("相对距离为:"+relativeDistance);
            }

        }
        System.out.println("警察所开车辆为:"+policeCar.carType);
        System.out.println("警车车速为:"+policeCar.speed);
        System.out.println("运钞车是否爆胎:"+cushCar.isBoomTie);
        System.out.println("爆胎时间为:"+cushCar.time/3600);
        System.out.println("追击时间为:"+time/3600);
    }

}

然后就是主函数:
在主函数中,通过随机方法得出警车每次分别是什么:
然后初始化线程,然后放入thread;

ublic class CoreJava01 {
    public static void main(String[] args) {
        PoliceCar policeCar=null;
        Random random = new Random();
        int carCode = random.nextInt(3);
        switch (carCode) {
        case 0:
            policeCar=new MotoCycle(50, "摩托车");
            break;
        case 1:
            policeCar=new Bus(100, "大巴车");
            break;
        case 2:
            policeCar=new Roadster(180, "跑车");
            break;

        default:
            System.out.println("车型有误");
            break;
        }
        CushCar cushCar=new CushCar(120,"运钞车");
        FollowRunable followRunable=new FollowRunable(50*1000, cushCar, policeCar);
        BoomTieRunable boomTieRunable=new BoomTieRunable(cushCar);
        Thread aThread=new Thread(followRunable, "追击事件");
        Thread bThread=new Thread(boomTieRunable, "爆胎事件");
        aThread.start();
        bThread.start();

    }
}

这个程序是我们在原来的案例,只是在线程这里进行了优化与结合,进一步明白线程的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值