![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| zone51 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 17.2.2006 Репутация: нет Всего: 1 |
Привет всем! Народ, что по вашему завершит поток? interrupt(),sleep(), или завершение метода run
Помоему это будет завершение метода run(). Но приведет ли к этому вызов interrupt()? Спасибо -------------------- The truth is out there |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
корректно поток завершается внутри себя
вам нужно задать переменную, которая будет это делать, примерно так:
|
|||
|
||||
| Galaran |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 25.5.2009 Репутация: 1 Всего: 2 |
sleep() это совсем не то, он заставляет поток "засыпать" на указанное время, а метод run мы напрямую завершить не сможем
interrupt() устанавливает статус потока interrupted, поток он не прерывает, только меняет его флаг. По этому флагу мы и будем определять завершен ли поток. Но в отличие от обычного флага, тут есть особенность: если исполняемый поток заблокировался на sleep или wait (да и любом другом методе, который генерирует InterruptedException), то при вызове interrupt() у этого потока, он разблокируется и дальше войдёт в блок обработки InterruptedExeption(это сделано, чтобы сразу завершать даже блокированный поток). Всё так нетривиально, потому что(как пишут в документации) метод stop() небезопасен. Кстати насчет прерывания блокировки без этого исключения хотелось бы узнать, например возможно ли прервать поток, который заблокировался на вводе-выводе. Т.е. выходит надо проверять флаг interrupted внутри потока, и если он true, то сразу завершать этот поток (просто дать ему дойти до конца метода run). Это сообщение отредактировал(а) Galaran - 18.10.2009, 18:50 |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Закрытие обьекта ввода-вывода ( close() ) разблокирует поток выбросом IOException. Методы ввода-вывода не предусматривают выброс исключения Interrupted. Следовательно, можно предположить, что вызов interrupt() на потоке, заблокированном на вводе-выводе, ничего не даст. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |