Остановка определенного потока 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()
метод на это.