我在 java 大学的一个项目上遇到了一些麻烦。
因此,这个项目是关于一个机场(服务器)和发送对象(飞机)的客户机来模拟它在两个或多个着陆轨道上的到达。我手头没有项目代码,所以我会尽量解释我自己。
现在,我的问题不是项目的分布式部分。我真正的问题是并发性。
所以,很明显,一次只能有一架飞机降落在每一条轨道上。
线程(airplanes)调用airport方法
(askLanding(Airplane ap))
顺便说一句,如果线程可以调用接收同一线程作为参数的方法,则使用idk
机场通过检查机场的每一条轨道(环路)来管理着陆,并检查它们是否开放着陆(我可以随时选择打开/关闭),然后调用另一个方法,一个同步的方法:
(tracks.get(i).toLand(ap))
如果轨迹正被另一个平面使用,线程将等待()。
我的问题是,如果第一条轨道是开放的,每架飞机都会在第一条轨道上等待,而其他轨道将是空的。如果我在asklanding()方法上检查tracks的可用性,我将锁定共享资源及其tracks(airport)。即使飞机只使用其中一条轨道着陆,其他飞机也不能在其他轨道着陆。
我觉得我在某个地方犯了个大错,但我就是看不出来。我会尽快在这里粘贴一些代码。
编辑:好的,这是一些代码:
飞机螺纹
公务舱飞机{
protected int tankCap;
protected int curFuel;
protected int flightNum;
protected int fuelCons;
protected Airport ap1;
protected boolean landed;
protected int time;
protected int priority;
public Aircraft(Airport ap1, int comb) {
this.ap1 = ap1;
flightNum = new Random().nextInt(300);
this.curFuel = comb;
this.landed = false;
}
@Override
public void run() {
ap1.reqLanding(this);
}
机场等级
公务舱机场{
private LinkedList<Runway> runways;
private LinkedList<Aircraft> aircraftsToLand;
public Airport() {
runways = new LinkedList<Runway>();
aircraftsToLand = new LinkedList<Aircraft>();
}
public void reqLanding(Aircraft a){
aircraftsToLand.add(a);
for(int i = 0; i != runways.size(); i++){
if(runways.get(i).getOpen()){
runways.get(i).land(a);
}
}
}
跑道等级-陆上法
public synchronized void land(Aircraft a){
numLanding++;
while(available == false){
try {
a.setFuel(a.getCurFuel() - a.getFuelCons());
System.out.println(a.toString());
wait();
} catch (InterruptedException e) {
System.out.println("Interrupted while on wait");
}
}
available = false;
runwayTxt.setText(a.toString());
System.out.println(getnPista().getText() + " A aterrar:" + a.toString());
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
}
System.out.println(getnPista().getText() + " Aterrou:" + a.toString());
runwayTxt.setText("");
numLanding--;
a.setLanding(true);
available = true;
notifyAll();
}
谢谢
暂无答案!
目前还没有任何答案,快来回答吧!