Я работаю над домашней работой о синхронизации потоков. Метод reduLoad () не может быть доступен при вызове этого метода. Все функции печати внутри метода reduLoad () никогда не вызываются. Если я не могу запустить этот метод, ключ никогда не будет выпущен.
Это может быть вызвано Semaphore.accquire () и Semaphore.realse (). Поэтому я попытался удалить все методы семафора, которые могут вызвать проблему.
Отображение результата программы ниже:
Как видите, программа удерживается после того, как все потоки выдают "высадка с парома в порту"
..... опустить некоторый результат здесь ....
Прибытие в порт 1 с грузом из 5 машин
Авто 4 прибывает в порт 0
Скорая помощь 1 прибывает в порт 1
Скорая помощь 1 садится на паром в порту 1
Авто 6 бортов на пароме в порту 1
Авто 8 бортов на пароме в порту 1
Авто 0 сходит с парома в порту 1
Авто 2 сходит с парома в порту 1
Авто 1 высаживается из парома в порту 1
Скорая помощь 0 высаживается на паром в порту 1
Авто 7 бортов на пароме в порту 1
Авто 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);
Этот метод reduLoad () должен освобождать ключ, когда паром пуст, этот ключ используется для уведомления других потоков о продолжении добавления новых автомобилей в паром
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();
}
}