我正在做有关线程同步的作业。当我调用此方法时,无法访问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();
}
}