"main"线程中的异常:java.lang.IllegalMonitorStateException。

7
我可以帮您翻译成中文。这段文字与编程有关,提到了 Java 中的 Thread,作者遇到了错误但不明白原因。以下是需要翻译的内容:

我在 Java 中使用 Thread,但出现了如下错误——我不理解为什么!

代码:

import java.util.Random;

public class Test {


    public static void main(String[] args) throws InterruptedException {
     Vlakno sude = new Vlakno("myName"); // Vlakno = thread class

        sude.start();
        sude.wait(); // ERROR IS ON THIS LINE
    }

}

class Vlakno extends Thread {

    private boolean canIRun = true;
    private final String name;

    Vlakno(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        while (canIRun) {
          //  System.out.println("Name: " + name);
        }
    }

    public void mojeStop() {
        System.out.println("Thread "+name +" end...");
        this.canIRun = false;
    }
}
2个回答

8
为了解决 IllegalMonitorStateException,您必须验证所有对 wait 方法的调用只在调用线程拥有适当的监视器时才进行。最简单的解决方案是将这些调用包含在 synchronized 块中。在 synchronized 语句中调用的同步对象是必须获取其监视器的对象。
synchronize (sude) {
  sude.wait();
}

想要了解更多信息和示例,请参考此处


0

来自Java Docs的Object.wait

IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。

在调用sude.start();之后,您有两个正在运行的线程:当前线程和运行sude的线程。当前线程不是对象监视器的所有者。

为确保您是对象监视器的所有者,请执行以下操作:

synchronize (sude) {
  sude.wait();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接