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

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

Ваш Ответ

6   ответов
1

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

Каждый раз, когда вы нажимаете кнопку, создается новый поток, который вызывает метод actionPerformed с аргументом ActionEvent. vishnu viswanath
javaworld.com/javaworld/jw-08-2007/... Проверь это. это может помочь тебе vishnu viswanath
Если я добавлю прерванную исключительную ситуацию через catch try, thread sleep не будет "заморозить» моя программа во время сна? и я'Могу ли я выполнять другие задачи, такие как нажатие кнопок в моей программе, пока мое утверждение, которое я усыпляю, спит? Jericho Aganon
Я положил его в класс, который будет работать, когда мой "if (button == a.getsource) " Заявление удовлетворено. Его цель в том, что я хочу установить метку видимым, а после сна установить другую для видимой, при этом я могу также нажимать другие кнопки, пока этот класс делает свое дело. Jericho Aganon
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
3

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

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

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

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

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

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

Таким образом, добавив прерванное исключение, я могу свободно закрыть свою программу во время сна или сделать что-то еще, пока она спит? Jericho Aganon
Скорее, если вы хотите закрыть приложение, то ваш спящий поток прерывается и имеет возможность его очистить ».перед закрытием, например, записать состояние в базу данных, зарегистрировать сообщение. James
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
Дон»не волнуйтесь, мы все начали здесь :) Benj
Что за история, нопримерно тот'сидеть ;) Benj

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