У меня есть кнопка "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 хранил объекты потока в хэш-карте, а не перечислял их во время выполнения.