Лучший способ обработки InterruptedException



Я использую поток.sleep (10000); следовательно, мне нужно обработать InterruptedException. Я могу позвонить нитке.текущий поток.interrupt () и затем бросить исключение для вызывающего класса или я могу непосредственно бросить его в вызывающий класс или есть какой-нибудь лучший способ обработать его ?

496   4  

4 ответов:

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

Если вы пишете Runnable или Callable это спит, вы можете использовать InterruptedException для выхода из любого цикла, который вы делаете, или вы можете поймать исключение и восстановить флаг прерывания, чтобы следующая проверка флага прерывания (с помощью Thread.currentThread().isInterrupted()) могла увидеть, что поток был прерван:

while(!Thread.currentThread().isInterrupted()){  
   //do something   
   try{  
     Thread.sleep(5000);    
   } catch(InterruptedException e){  
        Thread.currentThread().interrupt();
   }
}

В качестве альтернативы вы можете использовать исключение InterruptedException, чтобы выйти из цикла:

try {
    while (!Thread.currentThread().isInterrupted()) {
        // do something
        Thread.sleep(5000);
    }
} catch (InterruptedException e) {
    // flag value is not used here
    Thread.currentThread().interrupt(); 
}

Если вы разрабатываете объект, который вы ожидаете вложить в другие объекты, то бросьте исключение и добавьте его в метод подпись. В качестве примера рассмотрим API doc для классов в java.утиль.параллельные пакеты, как интерфейса blockingqueue, Смотри Как методы, как поставить и предложить бросить InterruptedException. Когда объекты, созданные для параллелизма, составлены вместе, они должны сотрудничать (и удостовериться, что они не теряют след прерванного состояния), чтобы убедиться, что они могут очистить и завершить отзывчивым образом.

В большинстве обычных кодов вы не должны использовать sleep. Часто есть лучший способ сделать то, что вы хотите.

Я могу вызвать поток.currentThread.interrupt ()

Это полезно, если вы хотите продолжать в обычном режиме, но без ожидания.

, а затем выбросить исключение для вызова класса

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

Или я могу прямо бросить его на вызов класс

В этом случае вы можете и не ловить.

Или есть какой-то лучший способ справиться с этим ?

Это зависит от того, почему вы ожидаете, что поток будет прерван. если я никогда не ожидаю прерывания, я заключаю его в AssertionError

Как правило, перестройте, если можете, или установите флаг прерывания, если не можете перестроить.

Хорошая статья об этом - http://www.ibm.com/developerworks/library/j-jtp05236/

, из которого эта самая уместная выдержка была бы:

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

Я использую поток.sleep (10000); следовательно, мне нужно обработать InterruptedException.

Не обязательно. Есть умные способы справиться с InterruptedException, и есть глупые способы. Если ваша нить никогда на самом деле не будет прервана, то имеет ли значение, какой путь вы выберете?

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

Comments

    Ничего не найдено.