Этот код может вызвать исключение IllegalMonitorStateException

void waitForSignal(){
    Object ob =new Object();

    synchronized (Thred.currentThread()) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Этот метод создает исключение IllegalMonitorStateException. Может кто-нибудь объяснить, почему так.

заранее спасибо

3 ответа

Решение

Вы должны только призвать wait на объекте, на котором вы приобрели блокировку.

В вашем коде вы приобрели блокировку на Thread.currentThread(), но вы вызываете его на ob, который бросит IllegalMonitorStateException,

Итак, вы должны изменить свой синхронизированный блок на: -

synchronized (ob) {

}

Вы хотите выполнить синхронизацию на ожидаемом объекте:

synchronized (ob) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Если даже вы исправили свою проблему с IllegalMonitorException, как

void waitForSignal() {
    Object ob = new Object();
    synchronized (ob) {

ваш код не будет работать В вашем коде каждый поток создает новую блокировку, невидимую вне метода. Нет возможности для других потоков уведомлять ожидающие темы.

Другие вопросы по тегам