具有多个共享资源的java线程

6gpjuf90  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(290)

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

谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题