Доступ к функции невозможен во время работы программы - PullRequest
0 голосов
/ 19 июня 2019

Я работаю над домашней работой о синхронизации потоков. Метод 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();
}

}

...