Java IllegalMonitorStateException

时间:2015-07-09 18:06:44

标签: java multithreading

-->

我需要一些帮助来了解我的程序出错的地方,我有一个非常简单的程序来学习多线程,但每次运行以下代码时都会给我一个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(); 
    }
} 

}

1 个答案:

答案 0 :(得分:2)

您应该了解,synchronized构造和wait / notify机制与对象实例相关联。在您的代码中,您正在使用

synchronized(thread2) { 
   …
        this.wait();

因此synchronized语句的对象和您正在调用wait的语句是不同的。这会导致IllegalStateMonitorException。请注意,在另一个线程在其自己的Thread1实例上调用notify()时等待Thread2实例将无效,因为notify只会唤醒等待的线程相同的实例

除此之外,你永远不应该在线程实例上进行同步。原因是Thread实现也将在其自己的实例上同步,因此这可能会产生干扰。此外,您不应像使用Thread类那样继承Thread1,而应像使用Thread2类一样使用合成。

相关问题
最新问题