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

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

我在 java 大学的一个项目上遇到了一些麻烦。
因此,这个项目是关于一个机场(服务器)和发送对象(飞机)的客户机来模拟它在两个或多个着陆轨道上的到达。我手头没有项目代码,所以我会尽量解释我自己。
现在,我的问题不是项目的分布式部分。我真正的问题是并发性。
所以,很明显,一次只能有一架飞机降落在每一条轨道上。
线程(airplanes)调用airport方法

  1. (askLanding(Airplane ap))

顺便说一句,如果线程可以调用接收同一线程作为参数的方法,则使用idk
机场通过检查机场的每一条轨道(环路)来管理着陆,并检查它们是否开放着陆(我可以随时选择打开/关闭),然后调用另一个方法,一个同步的方法:

  1. (tracks.get(i).toLand(ap))

如果轨迹正被另一个平面使用,线程将等待()。
我的问题是,如果第一条轨道是开放的,每架飞机都会在第一条轨道上等待,而其他轨道将是空的。如果我在asklanding()方法上检查tracks的可用性,我将锁定共享资源及其tracks(airport)。即使飞机只使用其中一条轨道着陆,其他飞机也不能在其他轨道着陆。
我觉得我在某个地方犯了个大错,但我就是看不出来。我会尽快在这里粘贴一些代码。
编辑:好的,这是一些代码:
飞机螺纹
公务舱飞机{

  1. protected int tankCap;
  2. protected int curFuel;
  3. protected int flightNum;
  4. protected int fuelCons;
  5. protected Airport ap1;
  6. protected boolean landed;
  7. protected int time;
  8. protected int priority;
  9. public Aircraft(Airport ap1, int comb) {
  10. this.ap1 = ap1;
  11. flightNum = new Random().nextInt(300);
  12. this.curFuel = comb;
  13. this.landed = false;
  14. }
  15. @Override
  16. public void run() {
  17. ap1.reqLanding(this);
  18. }

机场等级
公务舱机场{

  1. private LinkedList<Runway> runways;
  2. private LinkedList<Aircraft> aircraftsToLand;
  3. public Airport() {
  4. runways = new LinkedList<Runway>();
  5. aircraftsToLand = new LinkedList<Aircraft>();
  6. }
  7. public void reqLanding(Aircraft a){
  8. aircraftsToLand.add(a);
  9. for(int i = 0; i != runways.size(); i++){
  10. if(runways.get(i).getOpen()){
  11. runways.get(i).land(a);
  12. }
  13. }
  14. }

跑道等级-陆上法

  1. public synchronized void land(Aircraft a){
  2. numLanding++;
  3. while(available == false){
  4. try {
  5. a.setFuel(a.getCurFuel() - a.getFuelCons());
  6. System.out.println(a.toString());
  7. wait();
  8. } catch (InterruptedException e) {
  9. System.out.println("Interrupted while on wait");
  10. }
  11. }
  12. available = false;
  13. runwayTxt.setText(a.toString());
  14. System.out.println(getnPista().getText() + " A aterrar:" + a.toString());
  15. try {
  16. Thread.sleep(6000);
  17. } catch (InterruptedException e) {
  18. }
  19. System.out.println(getnPista().getText() + " Aterrou:" + a.toString());
  20. runwayTxt.setText("");
  21. numLanding--;
  22. a.setLanding(true);
  23. available = true;
  24. notifyAll();
  25. }

谢谢

暂无答案!

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

相关问题