Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > корректно завершить поток


Автор: Samotnik 7.11.2007, 14:49
САБЖ!
Ведь метод stop() deprecated  
А  как его корректно завершить ??
Код

case 3: {
                                System.out.println(clientMessageRecieved);
                                Thread.currentThread().stop();
                            }
                            break;

???

Автор: powerOn 7.11.2007, 14:54
Поток нужно завершать из потока. Т.е. оператором return в методе run() этого потока.

Автор: AntonSaburov 7.11.2007, 14:59
Вообщем-то предлагается обычно сделать переменную в классе потока, которую он будет постоянно отслеживать. Ну и при желании завершить поток она выставляется в состояние, по которому поток это понимает и заканчивает совю работу.

Автор: RebornCrusader 7.11.2007, 15:05
 smile 
Кстати, философский вопрос: почему интересно разработчики Java изначально сморозили такую глупость, несмотря на очевидную потребность в корректном завершении любого процесса? Я просто с трудом представляю задачу (кроме отрисовки GUI), которая идеологически (не обязательно в реализации) не требовала бы корректного завершения вместо хладнокровного убийства? smile

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

Автор: LSD 7.11.2007, 22:24
Цитата(RebornCrusader @  7.11.2007,  16:05 Найти цитируемый пост)
Кстати, философский вопрос: почему интересно разработчики Java изначально сморозили такую глупость, несмотря на очевидную потребность в корректном завершении любого процесса?

На эту тему у них даже есть отдельный документик: http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Автор: RebornCrusader 8.11.2007, 01:16
Хорошая статья, спасибо. Хоть и не совсем отвечает на мой вопрос, проясняет другие вещи smile

Автор: LSD 8.11.2007, 12:03
Вполне отвечает. Основная мысль в том, что корректно завершить поток, можно только из самого потока. Потому все методы "принудительного" завершения потока - deprecated.

Автор: ecologist 8.11.2007, 12:05
Дык идея в том, чтобы сам поток решал - можно или нельзя завершать его. Это будет корректно. А снаружи - это уже "убийство" smile

Добавлено через 41 секунду
Ну вот - не успел ответить - LSD уже успел. Эх, прогорел мой плюсик smile

Автор: RebornCrusader 8.11.2007, 12:38
Цитата(LSD @  8.11.2007,  20:03 Найти цитируемый пост)
Вполне отвечает. Основная мысль в том, что корректно завершить поток, можно только из самого потока.

Я это понял пять лет назад. Вопрос не в этом. Когда мы хотим корректно завершить поток -  мы снаружи выставляем какой-то флаг - дескать, завершайся. Поток у себя внутри периодически проверяет этот флаг, и действует соответственно. Только почему это не реализовано на уровне интерфейса? 

Я немного утрирую, но вот пример такого поведения:
Код

public interface CoolRunnable {
...

void run();

void stopPlease() throws DontWantToStopException;

}

Разработчик имплементит метод, где устанавливает себе какой хошь флаг, и как угодно его обрабатывает методе run(). А фишка в том, что этот механизм можно вызвать на стандартном уровне. Это не убийство, а вежливая просьба. Почему изначально не сделано столь очевидной вещи, или я всё-таки чего-то недопонимаю? smile



Автор: LSD 8.11.2007, 12:47
Цитата(RebornCrusader @  8.11.2007,  13:38 Найти цитируемый пост)
Разработчик имплементит метод, где устанавливает себе какой хошь флаг, и как угодно его обрабатывает методе run(). А фишка в том, что этот механизм можно вызвать на стандартном уровне. Это не убийство, а вежливая просьба. Почему изначально не сделано столь очевидной вещи, или я всё-таки чего-то недопонимаю?

1. Что тебе мешает это сделать самому?
2. Интерфейс Runnable используется много где, а не только в потоках. И например в SwingUtilities.invokeLater() метод stopPlease() будет явно лишним.
3. Не совсем понятно какой контракт надо закладывать в этот метод: как скоро поток должен остановиться, когда он должен выкидывать DontWantToStopException и т.д.

Автор: AlexeyVorotnikov 8.11.2007, 14:45
Цитата(LSD @ 8.11.2007,  13:47)
3. Не совсем понятно какой контракт надо закладывать в этот метод: как скоро поток должен остановиться, когда он должен выкидывать DontWantToStopException и т.д.

Поток должен остановиться как только, так сразу (когда сможет/захочет).
А ексепшн кидать, когда совсем не хочет останавливаться. smile

Автор: LSD 9.11.2007, 13:32
Цитата(AlexeyVorotnikov @  8.11.2007,  15:45 Найти цитируемый пост)
Поток должен остановиться как только, так сразу (когда сможет/захочет).

Ну и как можно работать с таким контрактом? Есть у нас поток который читает данные и в данный момент заблокирован на операции чтения, он может так висеть несколько часов или даже дней.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)