我在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;
}
}
答案 0 :(得分:6)
为了处理IllegalMonitorStateException
,您必须验证只有在调用线程拥有适当的监视器时才会发生wait方法的所有调用。最简单的解决方案是将这些调用封装在synchronized
块中。应在synchronized
语句中调用的同步对象是必须获取其监视器的同步对象。
synchronize (sude) {
sude.wait();
}
有关更多信息和示例,请查看here。
答案 1 :(得分:0)
来自Object.wait
IllegalMonitorStateException - 如果当前线程不是所有者 对象的监视器。
在调用sude.start();
之后,您运行了两个线程:当前线程和运行sude
的线程。当前线程不是对象监视器的所有者。
要确保您是对象监视器的所有者,请执行以下操作:
synchronize (sude) {
sude.wait();
}