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

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

Надеюсь, у меня есть смысл. Спасибо заранее.

Ответ 1

Thread t = CashierThread();  //keep the reference to thread somewhere...

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

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

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

t.interrupt();

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

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;
}

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