java.lang.IllegalMonitorStateException в методе notifyAll()

Я все еще учусь на Темах после обучающих программ java вебсайта оракула.

Что касается wait() и notifyAll(), я написал некоторый код. Мой ожидаемый вывод - напечатать сообщение в run() 10 раз и напечатать сообщение "Fun останавливается StopFun Thread" в guardedJoy(GuardedBlock guardedBlock) метод, когда "радость" установлена ​​в false в методе run.

Это мой код

public class GuardedBlock {

private boolean joy = true;

public synchronized void guardedJoy(GuardedBlock guardedBlock) {

    System.out.println(Thread.currentThread().getName() + " Guard Joy method started");
    while (guardedBlock.joy) {
        try {
            System.out.println(Thread.currentThread().getName() + " Going to waiting state");
            guardedBlock.wait();
        } catch (InterruptedException ex) {
        }
    }
    System.out.println("Fun stopped by StopFun Thread");
}

private static class StopFun implements Runnable {

    private GuardedBlock guardedBlock;

    public StopFun(GuardedBlock guardedBlock) {
        this.guardedBlock = guardedBlock;
    }

    @Override
    public void run() {

        for (int x = 0; x < 100; x++) {
            try {
                Thread.sleep(500);
                System.out.println("Allowing fun since its only " + x + " times - " + Thread.currentThread().getName());

                if (x == 10) {
                    guardedBlock.joy = false;
                    guardedBlock.notifyAll();
                    break;
                }
            } catch (InterruptedException ex) {
            }
        }
    }
}

public static void main(String[] args) {

    GuardedBlock guardedBlock = new GuardedBlock();

    StopFun sf = new StopFun(guardedBlock);
    Thread stopFun = new Thread(sf);
    stopFun.start();

    guardedBlock.guardedJoy(guardedBlock);
    }
}

Код в методе run работает нормально, но затем выдает исключение, подобное этому.

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    at java.lang.Object.notifyAll(Native Method)
    at Synchronization.GuardedBlock$StopFun.run(GuardedBlock.java:38)
    at java.lang.Thread.run(Thread.java:748)

Я прошел через пару вопросов и ответов на этом сайте, но не мог понять, что именно я делаю неправильно. Помощь очень ценится.

Благодарю.

1 ответ

Решение

wait() а также notify()/notifyAll() должен быть вызван в synchronized блок.

synchronized (guardedBlock) {
    guardedBlock.notifyAll();
}

и так далее.

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