У меня есть потоки, посвященные пользователям в системе, и я хочу, чтобы их можно было остановить в отдельности, я храню идентификатор потока с данными userdata при создании и затем вызываю прерывание? или я могу каким-то образом добавить поток к моим пользовательским объектам и просто называть его myuser.mythread.interrupt();
или это чертовски для магии?Определение идентификатора потока для объекта и прерывания
В настоящее время я могу остановить их всех и перезапустить без потока, который я хочу. Но это трудоемкая задача, а также вызывает задержку, когда пользователи должны ждать.
Обновление, не может быть ответом?
if(delete==true) {
if (Thread.currentThread().getId() == deleteId) {
Thread.currentThread().interrupt();
delete=false;
}
}
Update
мне удалось найти способ использовать myuser.mythread.interrupt(); Или вроде ..
Я добавил нить в качестве суб класса к классу пользователя и создал метод в классе пользователя для запуска и прерывания, теперь я могу запускать и останавливать темы с
online.get(1).hellos();
online.get(1).hellosStop();
Вместо того, чтобы создавать ссылку и отслеживать что-либо еще, кроме объектов пользователя.
Update (относительно принятого ответа, используя идентификатор в качестве ссылки я мог бы сделать это таким образом)
public class MyRunnable implements Runnable {
private boolean runThread = true;
@Override
public void run() {
try {
while (runThread) {
if(delete==true) {
if (Thread.currentThread().getId() == deleteId) {
Thread.currentThread().interrupt();
delete=false;
}
}
Thread.sleep(5);
}
}
catch (InterruptedException e) {
// Interrupted, no need to check flag, just exit
return;
}
}
}
У меня тоже было бы 'while (! Thread.interupted() && isActive)' (где isActive - это 'AtomicBoolean', который может быть переключен извне), содержащий основной цикл потока. Но, возможно, OP не может изменить содержимое своих потоков Runnable. –
Хорошо. в настоящее время у меня есть boolean var, который я установил в true или false, чтобы уничтожить потоки или вызвать прерывание, и в этом catch я снова запустил прерывание. который работал, но он контролирует все потоки. Есть ли способ «программно» добавить индикатор переменной для управления потоком? например 'boolean run_ + thread1 = true;'? так что поток работает 'while (run_ + getPassedData) {' –
Просто добавьте поле в свой поток. При создании потоков убедитесь, что его конструктор принимает AtomicBoolean в своем конструкторе. Затем это логическое значение может быть изменено, чтобы сигнализировать о прекращении потока. – john16384