2013-04-09 7 views
4

Я новичок в мире Java, так что несите меня, если это глупый вопрос.Что такое хорошая практика проверки InterruptedException?

Недавно я видел такой код в методе run() объекта Runnable.

try { 
    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // do something 

    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // do something 

    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // and so on 

} catch (InterruptedException e){ 
    // Handle exception 
} finally { 
    // release resource 
} 

Как часто и где следует проверять прерывание потока, что является хорошей практикой для этого?

ответ

5

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

+0

спасибо, может ли пользователь нажать клавишу или перехватить щелчок мышью? я просто думаю о другом случае: мы можем поставить его перед долговременным исполнением, поэтому, если прерывание произойдет до того, как поток войдет в эту часть, мы можем завершить поток, не тратя наши CPU или память на то, что уже недействительно. – jAckOdE

+0

@jAckOdE - прерывание - это то, что происходит, когда какой-то код вызывает 'thread.interrupt()'. – jtahlborn

3

Обычно я не вижу механизм прерывания потока - аналогично, если ваш код не прерывает потоки, то нити не нужно проверять, не были ли они прерваны. Однако, если ваша программа использует механизм прерывания нити, то хорошее место, чтобы поставить если (Thread.interrupted()) проверка на петле верхнего уровня в вашей Runnable: а Runnable часто выглядит как

run() { 
    while(true) { 
     ... 
    } 
} 

Yours бы вместо того, чтобы выглядеть

run() { 
    try { 
     while(true) { 
      if(Thread.interrupted()) { 
       throw new InterruptedException(); 
      } 
      ... 
     } 
    } catch (InterruptedException ex) { 
     ... 
    } 
} 
+0

Спасибо, для метода run(), который содержит бесконечный цикл, я думаю, что это, вероятно, стандартный шаблон. – jAckOdE

2

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

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

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