| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > корректно завершить поток |
| Автор: Samotnik 7.11.2007, 14:49 | ||
| САБЖ! Ведь метод stop() deprecated А как его корректно завершить ??
??? |
| Автор: powerOn 7.11.2007, 14:54 |
| Поток нужно завершать из потока. Т.е. оператором return в методе run() этого потока. |
| Автор: AntonSaburov 7.11.2007, 14:59 |
| Вообщем-то предлагается обычно сделать переменную в классе потока, которую он будет постоянно отслеживать. Ну и при желании завершить поток она выставляется в состояние, по которому поток это понимает и заканчивает совю работу. |
| Автор: RebornCrusader 7.11.2007, 15:05 |
| Кстати, философский вопрос: почему интересно разработчики Java изначально сморозили такую глупость, несмотря на очевидную потребность в корректном завершении любого процесса? Я просто с трудом представляю задачу (кроме отрисовки GUI), которая идеологически (не обязательно в реализации) не требовала бы корректного завершения вместо хладнокровного убийства? И вообще куда красивее было бы положить stop() в Runnable - пусть разработчик сам отределяет способ останова, но при этом остаётся унифицированный вызов. А может не только его? |
| Автор: RebornCrusader 8.11.2007, 01:16 |
| Хорошая статья, спасибо. Хоть и не совсем отвечает на мой вопрос, проясняет другие вещи |
| Автор: LSD 8.11.2007, 12:03 |
| Вполне отвечает. Основная мысль в том, что корректно завершить поток, можно только из самого потока. Потому все методы "принудительного" завершения потока - deprecated. |
| Автор: ecologist 8.11.2007, 12:05 |
| Дык идея в том, чтобы сам поток решал - можно или нельзя завершать его. Это будет корректно. А снаружи - это уже "убийство" Добавлено через 41 секунду Ну вот - не успел ответить - LSD уже успел. Эх, прогорел мой плюсик |
| Автор: RebornCrusader 8.11.2007, 12:38 | ||||
Я это понял пять лет назад. Вопрос не в этом. Когда мы хотим корректно завершить поток - мы снаружи выставляем какой-то флаг - дескать, завершайся. Поток у себя внутри периодически проверяет этот флаг, и действует соответственно. Только почему это не реализовано на уровне интерфейса? Я немного утрирую, но вот пример такого поведения:
Разработчик имплементит метод, где устанавливает себе какой хошь флаг, и как угодно его обрабатывает методе run(). А фишка в том, что этот механизм можно вызвать на стандартном уровне. Это не убийство, а вежливая просьба. Почему изначально не сделано столь очевидной вещи, или я всё-таки чего-то недопонимаю? |
| Автор: LSD 8.11.2007, 12:47 | ||
1. Что тебе мешает это сделать самому? 2. Интерфейс Runnable используется много где, а не только в потоках. И например в SwingUtilities.invokeLater() метод stopPlease() будет явно лишним. 3. Не совсем понятно какой контракт надо закладывать в этот метод: как скоро поток должен остановиться, когда он должен выкидывать DontWantToStopException и т.д. |
| Автор: AlexeyVorotnikov 8.11.2007, 14:45 | ||
Поток должен остановиться как только, так сразу (когда сможет/захочет). А ексепшн кидать, когда совсем не хочет останавливаться. |
| Автор: LSD 9.11.2007, 13:32 | ||
Ну и как можно работать с таким контрактом? Есть у нас поток который читает данные и в данный момент заблокирован на операции чтения, он может так висеть несколько часов или даже дней. |