Gre*_*een 15 java multithreading
我真的是Java兼容的新手,我正在尝试实现以下规范:
这不是确切的规范,但我唯一的问题是:
我无法让汽车在转弯时跳过.如果两辆车选择相同的位置,则一辆车停放,另一辆车等待,直到公园空闲.这不是我想要的行为.我的第一个想法是简单地将read和write同步到一个占用的变量:
class Car implements Runnable {
private CarState state = CarState.driving
run {
while(true) {
switch(state) {
case driving:
System.out.println(this + " driving.");
state = parking;
break;
case parking: Spot s = CarPark.getRandomSpot();
if(s.willingToPark(this)) {
System.out.println(s + " occupied. " + this
+ " skip park turn.");
} else {
s.park(this);
}
state = driving;
}
}
}
}
class Spot {
private boolean occupied = false;
private Car owner = new Car(...);
synchronized boolean willingToPark(Car c) {
if(occupied) {
return true;
} else {
occupied = true;
return false;
}
synchronized void park(Car c) {
System.out.println(c + " parking at " + this);
//don't care how this is implemented, just keep in mind
//that it will enter in a loop until the owner came back.
occupied = false;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我用三辆车运行这个,那么我最终会让car0停在spot1,car1停在spot0,car2正在spot0上等待,因为car1正在执行同步的停车场(Car c).如果愿意同步,两辆车可以在同一地点停车怎么办?
谢谢
如果愿意同步,两辆车可以在同一地点停车怎么办?
它实际上很简单.Car1捕获spot0并开始在循环内部park()方法中等待所有者(您没有提供代码).在等待时,它拥有监视器并且不允许任何人在spot0上调用同步方法.
这就是为什么car2挂在willingToPark()方法上的原因.
| 归档时间: |
|
| 查看次数: |
661 次 |
| 最近记录: |