Вопрос по java, multithreading – Как приостановить поток, используя идентификатор потока?

0

Код, который я пытаюсь

public void killJob(String thread_id)throws RemoteException{   
Thread t1 = new Thread(a);   
    t1.suspend();   
}

Как мы можем приостановить / приостановить поток на основе его идентификатора? Thread.suspend устарела, должна быть альтернатива для достижения этой цели. У меня есть идентификатор потока, который я хочу приостановить и убить поток.

Изменить: я использовал это.

AcQueryExecutor a=new AcQueryExecutor(thread_id_id);
Thread t1 = new Thread(a); 
t1.interrupt(); 
while (t1.isInterrupted()) { 
    try { 
       Thread.sleep(1000); 
    } catch (InterruptedException e) { 
       t1.interrupt(); 
       return; 
    } 
} 

Но я не могу остановить эту тему.

Я отредактировал свой ответ, чтобы сделать его более понятным. Извините за путаницу. Gray
О, я вижу, вы добавили вопрос. Вы не ставитеisInterrupted() проверьте в основной теме. Вы кладете это внутриAcQueryExecutor код.AcQueryExecutor Поток должен проверять, не прерван ли его собственный поток.while цикл в вызывающей стороне никогда не должен запускаться, потому чтоt1.interrupted() всегда будет правдой после того, как вы только что позвонилиt1.interrupt(). Gray

Ваш Ответ

2   ответа
0

PauseableThread реализация недавно, которая используетReadWriteLock внутренне. Используйте один из них или вариант, и вы сможете приостановить ваши темы.

Что касается приостановки их по идентификатору, небольшое прибегание к поискуспособ перебрать все потоки похоже, это должно работать.Thread выявилGetId метод в течение некоторого времени.

Убить нить другое.@Серый аккуратно накрыл это.

6

interrupt() Это. Это устанавливаетThread.isInterrupted() к истине и причинамwait(), sleep()и пару других способов броситьInterruptedException.

Внутри вашего потока кода вы должны делать что-то вроде следующего, который проверяет, чтобы убедиться, что он не был прерван.

 // run our thread while we have not been interrupted
 while (!Thread.currentThread().isInterrupted()) {
     // do your thread processing code ...
 }

Вот пример того, как обрабатывать прерванное исключение внутри потока:

 try {
     Thread.sleep(...);
 } catch (InterruptedException e) {
     // always good practice because catching the exception clears the flag
     Thread.currentThread().interrupt();
     // most likely we should stop the thread if we are interrupted
     return;
 }

Правильный способ приостановить поток немного сложнее. Вы могли бы установить какой-тоvolatile boolean suspended флаг для потока, на который он будет обращать внимание. Вы могли бы тогда использоватьwait() а такжеnotify() чтобы запустить поток снова.

Благодаря тонну. Искал такую функциональность. Один вопрос, есть ли утечка памяти, поскольку этот поток фактически не уничтожен. Что-нибудь еще, что я мог сделать, чтобы чисто убить ту нить ??
исполнительный нерв входит в вышеуказанный блок. Я добавил этот AcQueryExecutor a = new AcQueryExecutor (thread_id_id); Тема t1 = новая тема (а); t1.interrupt (); while (t1.isInterrupted ()) {try {Thread.sleep (1000); } catch (InterruptedException e) {t1.interrupt (); вернуть; }} happy
Оператор @happy not (!) отсутствует в цикле while и исправлен.
Я не совсем понимаю @happy. Вы начали тему? Этот код будет работать, если поток был запущен и был прерван.
Спасибо! Грей, это отличный ответ!

Похожие вопросы