IMSE_DONT_CATCH_IMSE
java.lang Class IllegalMonitorStateException java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IllegalMonitorStateException All Implemented Interfaces: Serializable public class IllegalMonitorStateException extends RuntimeException Thrown to indicate that a thread has attempted to wait on an object‘s monitor or to notify other threads waiting on an object‘s monitor without owning the specified monitor.
这个问题大抵是因为给没有锁的对象使用了诸如notify(),wait()等方法,所以抛出java.lang.IllegalMonitorStateException。
给实际上加锁的对象进行操作就可以了。
例如:
public class ThreadTest { public static void main(String[] args) { new Thread(new ThreadDemo()).start(); } } class ThreadDemo implements Runnable { private int i = 0; public synchronized void run() { try { ThreadTest.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + i); } }
妥妥地
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:503) at com.github.alaahong.ThreadDemo.run(ThreadTest.java:14) at java.lang.Thread.run(Unknown Source)
只需将其中的
ThreadTest.class.wait();
改成
this.wait();
即可。
原文:http://my.oschina.net/u/921876/blog/398300