Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Усыпить поток 
:(
    Опции темы
xbarmaglot
Дата 26.2.2013, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



Есть объект, вызовы которого необходимо производить в одном потоке.
Но сами вызовы (start/stop) я могу сделать лишь из разных потоков.
В голову пришло лишь запустить данный объект в отдельном потоке.
В начале работы вызвать start, а при внешнем interrupt в блоке finally вызывать stop.

Но при этом после запуска потока необходимо его усыпить по вызова interuupt.
Sleep(0xffffffff) как-то криво.

Как еще можно усыпить поток до его прерывания работы ?
PM MAIL   Вверх
Viroman
Дата 27.2.2013, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Самый лучший вариант, действительно запустить в другом потоке 
и использовать синхронизированные блоки с wait/notify

пример

Код

public class moiclass {
 public Object obj = new Object();
 
 public volatile boolean waiting = false; 

 public void unsleep()  {
   try  {
    synchronized(this.obj) {
      if(this.waiting) {
        this.obj.notify();   
      }
     }
   } catch(Exception e) { }
  }

  public static void main(String[] args) {
    moiclass mc = new moiclass();
    try  {
     synchronized(mc.obj) {
        mc.waiting = true; 
        mc.obj.wait();  
      }
    } catch(Exception e) { } 
  }

}

Думаю, принцип работы Вам будет понятен из этого нехитрого примера..
Будить можно будет из любого потока, а вот в wait Вам надо будет его уже из его собственного потока вызывать.

и ещё хотелось добавить, по сути ява не даёт технической возможности именно усыпить поток из другого потока, или deprecated уже давно, в общем руки прочь, на память уже не помню..Но любое обращение к потокам даёт ссылку на актуальный поток, который на тот момент обрабатывается, следовательно, усыплять поток надо из себя же.
Для этого обычно ставят в разных местах кода отпросы, типа если здесь значение true на сон, то усыпить..
Окончательная реализация будет зависеть от кода, который у Вас..


Это сообщение отредактировал(а) Viroman - 27.2.2013, 17:02
PM MAIL   Вверх
xbarmaglot
Дата 27.2.2013, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



Viroman, а что если просто wait() в потоке, а прервать его через interrupt ?
Тогда не нужен ни флаг ни синхронизация...
PM MAIL   Вверх
jk1
Дата 28.2.2013, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

Viroman, а что если просто wait() в потоке, а прервать его через interrupt ?


Wait нельзя вызывать вне synchronized-блока, получите IllegalMonitorStateException


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
xbarmaglot
Дата 28.2.2013, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



Цитата(jk1 @  28.2.2013,  07:14 Найти цитируемый пост)
Wait нельзя вызывать вне synchronized-блока, получите IllegalMonitorStateException

ну а если тогда wait в synchronized ? Но прервать interrupt-ом
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.