2015-11-04 5 views
-2

У меня есть клиент-серверное приложение, которое запускает метод получения для запуска в отдельном потоке. Потоку дается некоторое время, чтобы закончить задание, и поток будет проверен для статуса.Как перезапустить поток без использования Thread.stop()?

Бывают случаи, когда метод приема будет заблокирован из-за потери пакета или ACK. Если это произойдет, как я могу остановить поток и снова запустить его после следующей попытки?

Как мы все знаем, Thread.stop() устарел.

+1

Пожалуйста, добавьте код. Мы говорим о TCP или UDP? – Fildor

+3

Зачем нужно остановить поток только потому, что что-то произошло в сетевом сообщении? – Kayaman

+0

@ Кайман прав. Вам не нужно перезапускать поток, просто обработайте его правильно. Ожидается Packetloss. В случае TCP он будет обработан для вас стекю TCP; вам просто нужно дать ему некоторое время. – vhu

ответ

0

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

public class Runner implements Runnable { 

    private boolean done; 

    @Override 
    public void run() { 
     while (!done) { 
      try { 
       doSomeLongRunningStuff(); 

      } catch (InterruptedException e) { 
       System.out.println("Interrupted.."); 
      } 
     } 
    } 

    private void doSomeLongRunningStuff() throws InterruptedException { 
     System.out.println("Starting ... "); 
     Thread.sleep(300); 
     System.out.println("Still going ... "); 
     Thread.sleep(300); 
     done = true; 
     System.out.println("Done"); 
    } 

    public static void main(final String[] args) throws InterruptedException { 
     final Thread t = new Thread(new Runner()); 
     t.start(); 
     Thread.sleep(500); 
     t.interrupt(); 
     Thread.sleep(500); 
     t.interrupt(); 
    } 
} 

Можете ли вы это сделать так или иначе, зависит от того, что вы вызываете. Ваша инфраструктура, использующая TCP-соединение, может или не поддерживает прерывание.

+0

будет ли это происходить только тогда, когда поток работает должным образом, не блокируется и, следовательно, прекращается изящно ?. Что делать, если он заблокирован или усыпан в середине исполнения и не достигнет цикла while ?.Когда код все еще работает? –

+0

Это не сработает при любых обстоятельствах - но, как вы видите в примере, прерывание потока из сна не является проблемой. Вы должны проверить, как приостановлен поток, просмотрев код при подключении или использовании отладчика, чтобы узнать, что на самом деле происходит в вашем случае. – stalet

2

Вы не можете перезапустить поток Java на всех, с или без Thread.stop().

Вы должны создать новый.

Однако можно повторно использовать Runnable.

0

Мы не должны перезапустить поток, который не является действительным, когда нить comepleted его выполнение.

+0

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

Смежные вопросы