Вопрос по sleep, multithreading, java, exception – Java Thread Sleep и прерванное исключение

10
Зачем спящему потоку нужна попытка перехвата, чтобы перехватить прерывистое исключение?Почему во время сна даже возникает ошибка прерванного исключения? Это два вопроса, о которых я действительно хочу узнать в Java-программировании.искал через гугл и яу нас еще естьЯ нашел четкое объяснение тому, почему эти две вещи происходят.

Ваш Ответ

6   ответов
1

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

мы поймали его, его улов (InterruptedException e), если быть точным. Jericho Aganon
Если я добавлю прерванную исключительную ситуацию через catch try, thread sleep не будет "заморозить» моя программа во время сна? и я'Могу ли я выполнять другие задачи, такие как нажатие кнопок в моей программе, пока мое утверждение, которое я усыпляю, спит? Jericho Aganon
Итак, ваша проблема в том, что ваш пользовательский интерфейс застрял на столько времени, когда поток спит, и вы хотите этого избежать? vishnu viswanath
Где именно вы положили метод сна ()? vishnu viswanath
0

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

Поэтому часто можно увидеть такой код:

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

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

Официальный Java-учебник объясняет прерывания, В принципе, если у вас есть один потокt выполняя некоторую обработку, а затем пользователь хочет отменить ее из другого потока, который вы бы назвалиt.interrupt(), В коде, которыйработает на потокеtвсякий раз, когда этоsleep()с илиwait()и т. д.,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, так что'не проверено.)

1

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

Проверь этоdocs.oracle.com/javase/1.4.2/docs/api/java/lang/... jsedano
Таким образом, объявив прерванное исключение, я могу свободно нажимать любые кнопки, которые яВы вводили, пока вещи, которые я укладывал спать, спали? Потому что эточто ядо сих пор понял Jericho Aganon
0

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

Есть довольно хорошоРазработчик работает над статьей на эту тему.

Скорее, если вы хотите закрыть приложение, то ваш спящий поток прерывается и имеет возможность его очистить ».перед закрытием, например, записать состояние в базу данных, зарегистрировать сообщение. James
Таким образом, добавив прерванное исключение, я могу свободно закрыть свою программу во время сна или сделать что-то еще, пока она спит? Jericho Aganon
3

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

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

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

Забавно то, что я заинтересовался Java для его графического интерфейса и яЯ учусь только неделю, и я думаю, что начинать было плохой идеей, так как сначала я должен знать основы (все, что не связано с графическим интерфейсом). Хотя я надеюсь, что это хороший пример, ябуду спать заявление, которое добавляет два числа и одну вещь, которую ямы заметили, что спать "замораживает» программа yung или это происходит только в графическом интерфейсе? (извини, я правда нет знаю). И добавив прерванное исключение, вы 'Вы можете делать любые другие вещи, которые вы хотите сделать, пока вы спите с заявлением, которое вам приказано спать? Jericho Aganon
О, так, например, у меня есть два кадра, frame1 и frame2. Frame1 имеет кнопку, которая показывает кадр 2. Объявляя прерванное исключение, я могу нажать эту кнопку, чтобы показать мой frame2, пока frame1 спит? Jericho Aganon
Спать "замораживает» ток нить. Если вы хотите выполнить другое задание, вы должны выполнить его в другом потоке. Javier
Извини я неу меня нет достаточного опыта работы с параллелизмом в AWT / Swing. Я использую темы для фоновых задач. Если вы можете перефразировать ваш вопрос, не используя графический интерфейс, я был бы рад ответить. Javier
0

Вот чистый пример того, как может быть выдано Прерванное Исключение:http://www.javamex.com/tutorials/threads/thread_interruption.shtml

И обсудитьsleep() а такжеyield() Вот :http://www.coderanch.com/t/508657/threads/java/Sleep-Yield-state

Спасибо, это мне очень помогло. Jericho Aganon
Дон»не волнуйтесь, мы все начали здесь :) Benj
Мы сразу же нажали кнопку мыши, как только я увидела ответ, но он сказал, что мне нужно 15 очков репутации. Jericho Aganon
Тогда вы можете рассмотреть возможность использованиявверх» кнопка или "проверять" Кнопка, чтобы сказать спасибо каждому парню, который помог;) Я ' Benj

Похожие вопросы