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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно разбудить поток 
V
    Опции темы
Ak47black
  Дата 1.5.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Здравствуйте.
Никак не могу понять как правильно разбудить поток.
Тестовый код выглядит так
TestClass
Код

public class TestClass implements Runnable{
    Thread mainThread;
    public TestClass()
    {
        mainThread = Thread.currentThread();
    }

    public synchronized void run() {
        for (;;)
        {
            try {
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (!mainThread.isInterrupted())
                mainThread.notify();
        }
    }

    public synchronized void getData()
    {
        try
        {
            wait();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}


Использоваю так
Код

        TestClass test = new TestClass();
        SwingUtilities.invokeLater(test);
        test.getData();

Хочу сделать что-бы главный поток замораживался и ждал извещения от другого созданного потока который реализует класс TestClass.
На этом месте
Код

mainThread.notify();

получаю
Цитата

Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException

Вроде-бы всё в порядке.
Переменная mainThread действительно является главный потоком, который замораживается.


Это сообщение отредактировал(а) Ak47black - 1.5.2010, 20:29
PM MAIL   Вверх
Skynin
Дата 2.5.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потому что wait() вызывается для объекта test, а notify() для mainThread, причем без захвата монитора объекта (synchronized)

Взаимодействие между потоками в Java. Wait и notify.
В примерах можно убрать private static final Object monitor = new Object(); заменив объект блокирования monitor на this

А также:
"Случайный" выход из Object.wait()

PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Ak47black
Дата 2.5.2010, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Спасибо Вам Skynin, почитал и помогло  smile 

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

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

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


 




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


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

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