![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| barin_Student |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 488 Регистрация: 10.8.2007 Где: Казахстан , Алмат ы Репутация: 1 Всего: 2 |
Собсвенно так можно поставить вопрос: есть поток демон , он работает постоянно , то есть while (true) в методе run выполняются действия некоторые. В какой то момент мне нужно остановить или удалить этот поток. Делаю так
t- это поток. t.stop();- нормально проходит, но пишет на isAlive() - false , isDaemon - true, в этом странность №1. t.destroy() - IllegalMonitorException, на java.sun по этой ошибке вот что сказанно :Thrown to indicate that a thread has attempted to wait on an object's monitor or to notify other threads waiting on an object's monitor without owning the specified monitor. Так что мне синхронизация нужна? И почему он не может просто умереть? Помогите кто знает точно мз за чего чаще всего вылазиет эта ошибка. -------------------- Нехорошо блин!!! |
|||
|
||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
Похоже, что загадок никаких и нет.
1. Вы вызываете устаревший метод stop() и поток "умирает". 2. Это приводит к возврату isAlive() - false, что нормально, так как поток мертв. 3. isDaemon - true потому, что он БЫЛ демон 4. Затем Вы вызываете на МЕРТВОМ потоке устаревший метод destroy(), который и вовсе: "Deprecated. This method was originally designed to destroy this thread without any cleanup. Any monitors it held would have remained locked. However, the method was never implemented. If if were to be implemented, it would be deadlock-prone in much the manner of suspend(). If the target thread held a lock protecting a critical system resource when it was destroyed, no thread could ever access this resource again. If another thread ever attempted to lock this resource, deadlock would result. Such deadlocks typically manifest themselves as "frozen" processes." Остается один вопрос - зачем Вы после остановки потока с помощью Deprecated метода stop() пытаетесь вызвать на мертвом потоке еще и безобразный и Deprecated метод destroy() Добавлено @ 10:03 Используйте флаг для проверки цикла, ане просто true. Вызывайте для остановки потока interrupt() изменив при перехвате исключения значение флага с true на false. Это сообщение отредактировал(а) mbasil - 7.11.2007, 10:03 |
|||
|
||||
| barin_Student |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 488 Регистрация: 10.8.2007 Где: Казахстан , Алмат ы Репутация: 1 Всего: 2 |
Собственно , мне надо демона Стопать и запускать скажем тот же поток. Сейчас я его не убиваю Дестоем ,а стопаю , потом опять старт - и не работает , ладно еще поэкспериментирую и ответ с примером выложу.
-------------------- Нехорошо блин!!! |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Так не получится. Для того, чтобы иметь возможность возобновить выполнение потока, его не следует останавливать. -------------------- ![]() ![]() |
|||
|
||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
Надо поток не убивать, а усыплять и потом пробуждать вновь, при необходимости.
И не используйте Deprecated методы. Разработчики Java не зря объявили эти методы устаревшими - в этом случае они приняли совершенно правильное решение. Добавлено @ 12:17 Если точнее - "убитый" поток нельзя запустить вновь ! А вызов stop() приводит к страшной и мучительной смерти потока, а вовсе не его остановке, как Вы думаете. Это сообщение отредактировал(а) mbasil - 7.11.2007, 12:20 |
|||
|
||||
| barin_Student |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 488 Регистрация: 10.8.2007 Где: Казахстан , Алмат ы Репутация: 1 Всего: 2 |
Лано ,а как мне сделать усыпление на неопределенное время , и разбудить когда захочется?
-------------------- Нехорошо блин!!! |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Странно, что никто еще не направил на FAQ
|
|||
|
||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
|
|||
|
||||
| barin_Student |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 488 Регистрация: 10.8.2007 Где: Казахстан , Алмат ы Репутация: 1 Всего: 2 |
Да там о синхронизации все сказанно , а не о приастановке и старте. Интересно если у вас машина на трассе сломается , вы заедите на стоянку Камазистов и вам скажут вот книга читайте . - во всех случаях проблемы банальные не знают FAQ , просто есть сложнее и проще. Но вы ведь ответ знаете , почему просто не помочь , я ведь все таки учусь.
-------------------- Нехорошо блин!!! |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Также надо учиться добывать информацию и весь мир не только вокруг тебя вертится, чтоб подгонять христоматийные выдержки. В Факе это дело расписано.
Но вот элементарное описание Есть у класса Object 4 интересных метода по работе с потоками wait() - ждет неизмеримо бесконечно, пока его не разбудят notify() - уведомляет (будит) 1 из потоков в стопке ожидающих потоков notifyAll() - уведомляет (будит) всех ждущих потоков join() - ждет завершения работы потока остальное в любом поиске. Добавлено через 5 минут и 4 секунды Насчет "вращения", ничего личного, просто это базовый вопрос, его лучше изучить по книге, а не хвататься за то, что тебе на форуме скинут. Более того, о машине. Как говорится, "на переправе коней не меняют", если у тебя такая задача стоит, тебе необходимо изучить предметную область, и более того, технологии, средством которых ты будешь достигать цели. |
|||
|
||||
| barin_Student |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 488 Регистрация: 10.8.2007 Где: Казахстан , Алмат ы Репутация: 1 Всего: 2 |
Значит я делаю так
t- поток(демон) t.wait(); Потом какие то действия и вызываю метод notify(), но wait не работает , почему? Поток вот как примерно выглядит:
-------------------- Нехорошо блин!!! |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
А где у тебя тут wait()?
|
|||
|
||||
| barin_Student |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 488 Регистрация: 10.8.2007 Где: Казахстан , Алмат ы Репутация: 1 Всего: 2 |
А разве wait(), тоже надо в теле класса t описывать?
Добавлено через 12 минут и 21 секунду Сделал так тоже самое:
Вызываю так t thread = new t(); t.start(); t.Waiter();// там в catch и выводит IllegalMonitorException; -------------------- Нехорошо блин!!! |
||||
|
|||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
wait() можно вызывать только в синхронизированном коде.
Я же Вам привел пример приостанавливаемого потока-демона. Еще раз с комментариями и небольшими улучшениями
|
|||
|
||||
| barin_Student |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 488 Регистрация: 10.8.2007 Где: Казахстан , Алмат ы Репутация: 1 Всего: 2 |
Ok ? счас попробую , теперь что то стало понятно.
-------------------- Нехорошо блин!!! |
|||
|
||||
![]()
|
| Правила форума "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. |