Как остановить поток, когда его в ожидании () - PullRequest
0 голосов
/ 25 апреля 2018
 while (!closingTime){ 

        depot.enterramp();
    }

Для запуска функции, как показано ниже

  synchronized (list) {

        while (list.size() == 0) {
            System.out.println(":: DEPOT\t:: " + "NO BUS FOUND IN THE APPROACHES DEPOT, WAITING THE BUS COMING");
            try {
                list.wait();

            } catch (InterruptedException iex) {
                iex.printStackTrace();
            }
        }

В настоящее время моя ветка ожидает уведомления () [Этот код находится в enterramp ()]

public class Clock extends Thread {
public void run() {
    try {
        Thread.sleep(15000);
        notifyTime();

    } catch (Exception e) {

    }
}

public synchronized void notifyTime() {
    System.out.println(":: CLOCK\t:: ALERT ALERT !!! DEPOT HAVE TO CLOSE IN 30 MINUTES, NO MORE ACCEPTING THE BUSES");
    closingTime = true;

    return;


}

Это часы сна в течение 15 секунд и сделать время закрытия истинным

 synchronized (list) {
            list.add(bus);
            list.notify();
        }

Это моя часть уведомления

Проблема, с которой я сталкиваюсь, заключается в том, что при закрытии == true, но поток застревает в области wait (), как я могу заставить поток выйти из wait (), когда мое время закрытия == true ???

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

a) Ваше условие выхода (логическое закрывающее время) И блокировка (при которой происходит синхронизация) должны использоваться ожидающими потоками.Ваш код может подождать, пока список пуст и условие выхода ложно.

b) вы синхронизируете на 2 мониторах;«это» и «список».Если критическая зона была защищена только одним выделенным монитором (несколько нормально использовать список), то добавление к списку ИЛИ изменение условия выхода closeTime может одновременно использовать notify ().Это означает, что нужно выкинуть ожидающий поток без прерывания, как это предназначено.

c) стараться избегать notify (), используйте notifyAll (), если вы действительно не знаете, почему вы должны уведомлять только одного.

0 голосов
/ 25 апреля 2018

В вашей логике вы должны подождать, если нет автобусов И это не время закрытия. Но вы проверяете только первое условие. Я предлагаю уведомить поток, когда вы устанавливаете значение closeTime в true. Сделайте эти изменения:

while (list.size() == 0 && !closingTime) {


closingTime = true;
list.notifyAll();

Тем временем по теме interrupt (): он выводит вас из ожидания (), но его логика сильно отличается. Он предназначен для внешнего контроля, как сигнал, чтобы остановить выполнение и выйти. Поэтому, когда вы хотите прекратить ожидание, используйте notyfyAll (), когда вы хотите, чтобы BREAK выполнение, используйте interrupt ().

0 голосов
/ 25 апреля 2018

Если вы прочитали документацию Object::wait, там написано следующее:

Заставляет текущий поток ждать, пока другой поток не вызовет метод notify () или метод notifyAll () для этого объекта, или некоторые другой поток прерывает текущий поток, или определенное количество в реальном времени.

Так что вам нужно прервать поток.

...