2014-11-04 1 views
0

Я реализовал поток проверки соединения. Когда я создал большой трафик, я понял, что существует много экземпляров «ConnWatchdogThread». Я думаю, что инструкция «continue» запускает прерванный поток в реальном времени, и в этом случае создается новый «ConnWatchdogThread». Если да, то как это происходит? Как поток прерывается?How and Why Thread прерван при перегруженном трафике

private class ConnWatchdog extends Thread { 

public ConnWatchdog(){ 
setName("ConnWatchdogThread"); 
} 
     private void checkConnections() { 

    //connection check 
     } 

     @Override 
     public void run() { 

     while (true) { 
      try { 
       Thread.sleep(checkPeriod); 
      } catch (InterruptedException e) { 
//    e.prinstackTrace() 

       continue; 
      } 

      try { 

       this.checkConnections(); 

      } catch (Throwable t) { 

      } 

     } 

     } 
    } 

ответ

1

Прерывание происходит, когда вызывается метод прерывания в потоке. В вашем примере не показано, что делает прерывание. Вот an example of using interrupt.

continue продвигает управление следующей итерации цикла. Поэтому, когда что-то вызывает прерывание на вашем потоке, пока оно спит, оно освобождается от сна (очищая флаг прерывания), а затем он отправляет его обратно в верхнюю часть цикла и снова переходит в режим сна, что кажется бессмысленным.

Ничто в показанном коде не вызывает создание нового потока.

Было бы более обычным использовать прерывание для выхода из цикла while и заставить поток прекратить работу. Использование прерывания для другой, чем нарезания отмена вещи не рекомендуется (Java Параллелизм на практике, 7.1, стр 138):

Там нет ничего в API или языковой спецификации, которая связывает прерывание к какой-либо конкретной отмене семантике, но в практика, использование прерывания для чего угодно, но отмена является хрупкой и трудно выдерживается в более крупных приложениях.

0

Единственный способ создать новую тему - new Thread(...). Ваше продолжение приводит к тому, что прерывание игнорируется и для него нужно немного спать.

Прерывание - это особый флаг (но в основном по-прежнему только флаг). Когда вы используете interrupt() a Thread, это вызовет некоторые методы для исключения InterruptedException, даже если они блокируют. После срабатывания флаг сбрасывается.

Как правило, это плохая идея игнорировать исключение/ошибку, вызванную esp в коде, который не работает отлично.

0

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

Отправьте свой код, вызывающий ConnWatchdog /, создавая его, чтобы увидеть полную картину. Это в цикле?

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