![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
поддержка Runnable подразумевает метод run()
мне нужна возможность приостановки и запуска потока. единственное решение - зациклить код и использовать флаг
но тогда поток (если этого ненужно) постоянно гоняется в цикле (трата процессорного времени) Можно ли приостановить поток и перезапустить его ? |
|||
|
||||
| djGri |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 21.2.2005 Репутация: 1 Всего: 3 |
функция wait() - усыпляет
используется в блоке
функция notify() - будит Если есть еще треды, используй yield() , чтобы усыпить, notify() - будить |
|||
|
||||
| Erast |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 14.7.2005 Репутация: нет Всего: нет |
а лучше все-таки
sleep отдает процессорное время, а wait нет |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
А еще лучше - исходный вариант
-------------------- |
|||
|
||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Да уж тогда лучше:
Без yield() в данном случае на некоторых операционках может получиться лажа, особенно если этот тред имеет приоритет больше чем у других тредов (немного неточно сформулировал). Все это очень хорошо описано в туторе по тредам. Откуда вообще такие вопросы берутся на форуме? Дополнение: yield() лучше вообще из else вынести, чтобы проходил на каждом выполнении цикла. Это сообщение отредактировал(а) Zandr - 14.7.2005, 06:03 |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
В твоем варианте будет нехило кушацца процессор тк тред спать не будет а просто будет гоняться в цикле. yield ничего особенного не делает, это команда дать другим потокам время на выполнение, т.е. перепланировать распределение времени между процессами. -------------------- |
|||
|
||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Ну так вот именно
А варианте выше проц тоже будет кушаться. На постоянную проверку флага. Которая так же будет гоняться в цикле. Или компилятор сумничает и проведет какую-то оптимизацию? |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Если поставить sleep то не будет. Я к тому, что yield sleepа не заменит. -------------------- |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 4 Всего: 12 |
Domestic Cat и Zandr
Вы уж меня извините, но чем, В ПРИНЦИПЕ, отличны ваши коды? -------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
А вообще лучше как раз разобраться с wait-notify.
Если синхронизация нужна еще для каких-то целей, можно сделать объект-пустышку и делать synchronized( lockObject) {...} Это сообщение отредактировал(а) Zandr - 14.7.2005, 08:46 |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
Domestic Cat, а почему лучше мой способ ? ведь процессорное время кушается без нужды.
и почему плохо yield() - впольне логично отдать процессорное время при ненадобности. поставить sleep я не могу - ведь мне нужно преостановить поток из другого потока на неопределенное время. Тоесть пока я не захочу - мой поток спит (неограниченное время). Как только я захотел - он просыпается - можно ли так сделать. З.Ы. Более того - корректное завершение потока в любой ОС - это дать завершиться потоковой функции. Но в данном случае она никогда не завершиться, ведь
может тогда по лучше при каждой надобности просто создавать новый объект Thread и запускать его, а когда он не нужен - убивать его - тогда будет правильнее(интервалы между созданиями потоков достаточно большие). Или я неправ? |
|||
|
||||
| Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
В Java нет средств остановить или продолжить выполнение потока. Но это можно обойти несколькими способами.
1. Создавать тред каждый раз. Проблема в том, что его нельзя просто остановить, он сам должен узнать что должен остановиться. Плюс нужно передавать данные из треда в новый тред. Все это ест ресурсы. 2. Использовать javax.swing.Timer. Там есть нужные методы 3. Использовать wait/notify. 4. Этот вариант
Если все так и оставить, то тред будет гонять холостой бесконечный цикл при флаге=фалс. Потому
Главное тут - спать немного, нагрузка на проц намного уменьшится. Насчет yield - это сигнал планировщику перепланировать временные срезы тредов. Это не сигнал остановить тред. -------------------- |
||||
|
|||||
| NotGonnaGetUs |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 4 Всего: 12 |
плюсек за вариант Зандра.
если делать через sleep, поток всё равно будет кушать ресурсы, через wait/notify - не будет совсем. |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 4 Всего: 12 |
Спасибо, Domestic Cat, а что делать на случай аварийного зацикливания потока?
-------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
Zandr, спасибо - помогло
|
|||
|
||||
![]()
|
| Правила форума "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. |