线程“main”中的异常java.lang.IllegalMonitorStateException

时间:2015-05-15 14:35:07

标签: java multithreading

我在Thread中使用Java,我发现以下错误 - 我不明白为什么?!

代码:

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 个答案:

答案 0 :(得分:6)

为了处理IllegalMonitorStateException,您必须验证只有在调用线程拥有适当的监视器时才会发生wait方法的所有调用。最简单的解决方案是将这些调用封装在synchronized块中。应在synchronized语句中调用的同步对象是必须获取其监视器的同步对象。

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

有关更多信息和示例,请查看here

答案 1 :(得分:0)

来自Object.wait

的Java文档
  

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

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

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

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