Подтвердить что ты не робот

Спящий режим Java и прерывание исключения

  • Почему для потока сна нужна попытка catch catch для прерывания исключения?
  • Почему сон даже испускает ошибку прерывания? Это два вопроса, о которых я действительно хочу узнать в java-программировании Я искал через google, и я до сих пор не нашел четкого объяснения, почему это происходит.
4b9b3361

Ответ 1

1.- Поскольку Thread can not завершает свое нормальное выполнение, если вы его прерываете, и вам нужно поймать это, чтобы быть готовым что-то сделать. 2.- Поскольку ожидание потока отличается от прерванного потока, ожидание потока может быть возобновлено, но прерываемый поток уже завершен.

Ответ 2

An InterruptedException бросается, когда поток заблокирован/ждет, и он прерывается другим потоком (с помощью Thread.interrupt). Подумайте об этом как о запросе на немедленное прекращение, которое не страдает от недостатков Thread.stop().

Таким образом, даже если вы инструктируете поток спать в течение нескольких лет, вы можете прервать этот поток.

Рекомендуемая практика отменяет все, что вы обрабатываете, когда вызывается InterruptedException.

Ответ 3

Когда вы просите поток спать, ожидаемое поведение для этого потока - спать в течение этого времени. Поэтому, если сон прерывается, он будет вызывать InterruptedException, чтобы указать, что он не может выполнить задачу. И вы можете позаботиться о том, что следует делать, если оно прервано.

Ответ 5

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

Ответ 6

Сон и прерывания не связаны семантически. Просто дизайнеры Java подумали, что когда вы хотите, чтобы ваш поток спал, это хорошая возможность напомнить вам о прерываниях. Это похоже на Duke: "Похоже, вы пытаетесь спать, вы также хотели бы сделать свою нить хорошим гражданином, сделав уверен, что он правильно реагирует на события прерывания, когда возникает необходимость в том, чтобы заставить его резко прекратиться на более позднем этапе вашего проекта?"

Таким образом, часто можно увидеть такой код:

try {
    Thread.sleep(1000);
} catch (InterruptedException ie) {
    //Don't worry about it.
}

Иногда люди говорят, что это считается плохой практикой. Но если вы не планируете использовать средство прерываний в своей программе, то эти исключения никогда не будут брошены, поэтому вы должны спросить себя, выполняете ли вы дополнительную работу, чтобы позаботиться об этих исключениях, если вы решите добавить функция прерывания вашей программы через некоторое время имеет смысл. Это одна из тех вещей, которые разработчики Java настаивали на том, что каждый поток должен делать - что вы могли бы interrupt(), и он быстро и чисто прервет то, что он делает. Я думаю, что во многих случаях это необязательно, но люди будут смотреть на ваш код, видеть это и все еще говорить "eew, плохая практика!"

Официальное руководство по Java объясняет прерывания. В принципе, если у вас есть один поток t, выполняющий некоторую обработку, а затем пользователь хочет его отменить, из другого потока вы вызовете t.interrupt(). В коде, который выполняется в потоке t, всякий раз, когда он sleep() s, или wait() s и т.д., Будет выбрано значение InterruptedException. Если он не делает ни одного из них, он может (должен) также узнать, прерывался ли он с помощью Thread.interrupted() время от времени. Во всех этих способах обнаружения прерываний он должен отказаться от того, что он делает и очистить как можно скорее. (То есть: если это так, то это может быть полезно для вас или кого-то - что идея прерываний.)

Итак, Java делает это проверенным исключением метода sleep(..), чтобы заставить вас думать об использовании этого средства. Другая часть рассуждения состоит в том, что если sleep(..) прерывается, то он рано проснется и это исключительное событие. (Но помните, что там "если" .)

Важно то, что прерывания не просто происходят без причины. Они происходят, если вы пишете код, чтобы заставить их произойти, или кто-то другой, кто запускает ваши потоки и требует отменить свою деятельность. Так вот кто вызывает Thread.sleep(..), чтобы выбросить InterruptedException. Вы делаете. И если вы этого не сделаете, вам все равно нужно поймать его.


Изменить.. Кстати, лучше было бы сделать это следующим образом:

try {
    Thread.sleep(1000);
} catch (InterruptedException ie) {
    throw new UnsupportedOperationException("Interrupts not supported.", ie);
}

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