![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
Есть поток, который должен засыпать на длительное время, но который нужно быстро остановить по требованию.
Решил использовать CountDownLatch.
Это нормальное решение или можно как еще ? |
|||
|
||||
| jk1 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Нет. Если хочется сделать на голых потоках, то лучше пользоваться стандартными механизмами прерывания работы потока:
А вообще подобные вещи принято делать на таймерах, чтобы избежать возможных проблем при ручном разруливании взаимодействия потоков:
-------------------- Opinions are like assholes — everybody has one |
||||||
|
|||||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
а чем мой способ плох ? Какие причины проблемм ? Добавлено через 1 минуту и 36 секунд Ведь я корректно завершаю поток... Добавлено через 2 минуты и 25 секунд Да и после thread.interrupt() нужен ли join() ? |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
1. Тем, что использует нестандартный подход без необходимости. Совершенно типовая задача решается нестандартным способом. 2. Тем, что использует CountDownLatch не по назначению. Образно выражаясь, Вы копаете яму молотком. Теоретически это возможно, но непонятно зачем - проще взять лопату. 3. Тем, что это просто велосипед, в котором Вашим коллегам придется потом разбираться. Для периодических задач принято использовать таймеры или пулы потоков с функциональностью таймеров. Кстати все они в Java оборудованы возможностью прерывания. Зачем писать свое когда уже есть готовое?
Нет. Он и в исходном варианте не нужен. Зачем тормозить без причины вызывающий поток? -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
c join понятно.
А вот поток у меня засыпает
но нифига не просыпается. То есть я не вижу периодических записей "Doing some work" В чем может быть проблема ? |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: нет Всего: 17 |
||||
|
||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
понятно
Есть еще несколько вопросов: 1. Как усыпить поток до ожидания прерывания ? То есть нужно в отдельном потоке запустить потоковый объект и ждать завершения потока. А если он останавливается, то в блоке finally остановить поток. Просто Thread.sleep(0xFFFFFFFF) как-то кривовато 2. Если поток не запущен, то к чему приведет внешний вызов interrupt ? Ведь блок try/catch внутри потока. Будет ли исключение брошено ? Если да, то уго нужно ловить извне ? 3. Если потоковый объект запущен, то будет ли он приостановлен, если сам поток засыпает на ожидании прерывания ? |
|||
|
||||
| jk1 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
А зачем нужен поток который ждет, пока его не прервут?
Вызывающий код получит IllegalThreadStateException
Если поток ушел в sleep, то, очевидно, он не выполняется. Или под "приостановкой" Вы понимаете что-то другое? -------------------- Opinions are like assholes — everybody has one |
||||||
|
|||||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
||||
|
||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
еще вопрос - можно ли после interrupt снова запускать поток ? Или его нужно пересоздавать ?
|
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
interrupt не завершает работу потока, он просто выставляет флаг. Поток, прочитав этот флаг, может сам завершить свою работу (вернуть управление из метода run), если захочет. После завершения работы потока повторный его запуск уже невозможен.
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
![]()
|
| Правила форума "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. |