Остановка определенного потока Java

У меня есть кнопка "addCashier", которая создает поток под названием "Касса", теперь этот поток просто генерирует заказы каждые 4 секунды, цикл while(true) в методе run() потока. Там все хорошо, но теперь я хочу добавить кнопку для имитации выхода из кассы. Я добавил логическую переменную в свой цикл while onDuty и открытую функцию logOff(), которая устанавливает для этого onDuty bool значение false, чтобы вытащить меня из цикла while. Моя проблема сейчас из моего класса графического интерфейса, как я могу вызвать функцию в определенном потоке? Каждый поток кассира был сгенерирован во время выполнения, поэтому я не знаю их имен.

Надеюсь, я понял. Заранее спасибо.

4 ответа

Решение
Thread t = CashierThread();  //keep the reference to thread somewhere...

Теперь вместо логического свойства используйте встроенный флаг прерывания:

public void run() {
  while(!Thread.currentThread().isInterrupted()) {
    //...
  }
}

Если вы хотите перевести тему, нажав на кнопку, просто позвоните:

t.interrupt();

Конечно, вам нужно иметь доступ к t переменная из клиентского кода.

Если сбор ссылки на все потоки является проблемой, другим способом может быть использование открытого статического синхронизированного HashMap, в котором ключом является threadId(случайное число, назначенное во время выполнения каждому потоку), а логическим значением - значение. Вы можете изменить цикл while, чтобы выбрать соответствующее логическое значение из этой централизованной карты. Это позволит вам выйти из конкретного кассира.

Вы можете хранить ссылку на объект Thread где-нибудь, чтобы вы могли вызывать threadObj.logOff()

Если вы не хотите этого делать, то при создании thred вы можете назначить уникальное имя для потока.

public void run ()
{
    this.setName(strCashireID);
    ......
}

Во время выполнения вы можете получить поток:

Thread getThread(String strCashireID) {
   ThreadGroup threadGroup = Thread.currentThread( ).getThreadGroup( );
   Threads[] threads = new Thread[ threadGroup.activeCount() ];
   threadGroup.enumerate(threads);
   for (int nIndex=0; nIndex<threads.length; nIndex++) {
      if(threads[nIndex] != null && threads.getName().equals(strCashireID) {
         return threads[nIndex];
      }
   }
   return null;
}

Я по-прежнему буду предлагать хранить объекты потоков в хэш-карте, а не перечислять их во время выполнения.

Вы можете сохранить ссылку каждого потока в HashMap - вместе с его id или же Name как ключ. Позже, когда вы захотите разобраться с одним конкретным потоком кассира, используйте Name или же id получить соответствующий Thread из HashMap и вызвать соответствующий logOff() метод на это.

Другие вопросы по тегам