我需要一些帮助来了解我的程序出错的地方,我有一个非常简单的程序来学习多线程,但每次运行以下代码时都会给我一个IllegalStateMonitorException。我不知道是什么造成了这个,虽然我怀疑它可能是我的同步块,谢谢。
主要方法类:
public class Lab8 {
public static void main(String [] args) {
Thread1 thread1 = new Thread1();
thread1.start();
}
}
主题1:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Thread1 extends Thread {
public DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
public Thread1() {
super("Thread1");
}
public void run() {
Thread2 thread2 = new Thread2();
System.out.println("==Start: " + dateFormat.format(new Date()) + "==\n");
synchronized(thread2) {
try {
this.wait();
} catch (InterruptedException e) {
System.err.println(e.toString());
}
(new Thread(thread2)).start();
}
System.out.println("==End: " + dateFormat.format(new Date()) + "==\n");
}
}
主题2:
public class Thread2 implements Runnable {
@Override
public void run() {
synchronized(this) {
for(int i = 1; i <= 100; i++) {
System.out.print(i + " ");
if(i % 10 == 0) {
System.out.print("\n");
}
}
notify();
}
}
}
答案 0 :(得分:2)
您应该了解,synchronized
构造和wait
/ notify
机制与对象实例相关联。在您的代码中,您正在使用
synchronized(thread2) {
…
this.wait();
因此synchronized
语句的对象和您正在调用wait
的语句是不同的。这会导致IllegalStateMonitorException
。请注意,在另一个线程在其自己的Thread1
实例上调用notify()
时等待Thread2
实例将无效,因为notify
只会唤醒等待的线程相同的实例。
除此之外,你永远不应该在线程实例上进行同步。原因是Thread
实现也将在其自己的实例上同步,因此这可能会产生干扰。此外,您不应像使用Thread
类那样继承Thread1
,而应像使用Thread2
类一样使用合成。