Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как правильно разбудить поток


Автор: Ak47black 1.5.2010, 20:28
Здравствуйте.
Никак не могу понять как правильно разбудить поток.
Тестовый код выглядит так
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 действительно является главный потоком, который замораживается.

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

http://stremoukhov.ru/vzaimodeistvie-mejdu-potikami-java
В примерах можно убрать private static final Object monitor = new Object(); заменив объект блокирования monitor на this

А также:
http://blogs.sun.com/vmrobot/entry/случайный_выход_из_object_wait

Автор: Ak47black 2.5.2010, 21:35
Спасибо Вам Skynin, почитал и помогло  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)