程序运行时无法访问功能

时间:2019-06-19 20:29:03

标签: java methods semaphore

我正在做有关线程同步的作业。当我调用此方法时,无法访问reduceRed()方法。 reduceLoad()方法中的所有打印函数都不会被调用。如果无法运行此方法,则将永远不会释放密钥。

这可能是由Semaphore.accquire()和Semaphore.realse()引起的。因此,我尝试删除所有可能导致此问题的信号量方法。

  

下面的程序结果保护

如您所见,程序在所有线程打印“端口上的轮渡离船”之后被保留

  

.....在这里省略一些结果。...

     

载有5辆车的港口1到达

     

自动4到达端口0

     

救护车1到达端口1

     

救护车1在1号端口登上渡轮

     

在端口1的渡轮上自动放置6个板子

     

在端口1的渡轮上自动放置8个板子

     

自动0从1号港口的渡轮下船

     

自动2从1号港口的轮渡下船

     

自动1号船从港口1下船

     

救护车0在1号港口下船

     

在端口1的渡轮上自动放置7个板子

     

自动3从1号港口的轮渡下船

在这里调用函数

      // Arrive at the next port
  port = 1 - port;

  // wait for ferry arrives
  while (fry.getPort() != port) {
    try {
      sleep(1000);
    } catch (Exception e) {

    }
  }

  // disembarking
  System.out.println("Auto " + id_auto + " disembarks from ferry at port " + port);
  logger.check(fry.getPort() == port, "error unloading at wrong port");
  fry.reduceLoad(); // Reduce load
  System.out.println("Auto " + id_auto + " successfully disembarks from ferry at port " + port);

轮渡为空时,此方法reduceLoad()应释放一个键,该键用于通知其他线程继续向轮渡添加更多汽车

public synchronized void reduceLoad() {

logger.check(load > 0, "error unloading an empty Ferry!");
load = load - 1;
System.out.println("removed load, now " + load);

if (load == 0) {
  unloadingDone.release();
}

}

0 个答案:

没有答案