使用内容:多线程,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();
}
}
这个程序是我们在原来的案例,只是在线程这里进行了优化与结合,进一步明白线程的操作。