如下给出正确处理后的代码:
package com.test.thread;
public class ThreadTest {
private static Object obj = new Object();
/**
* @param args
*/
public static void main(String[] args) {
Thread inThrd = new InnerThread();
System.out.println("First started: " + Thread.currentThread().getName());
inThrd.start();
waitThrd();
///
for(int i=0; i<10; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(" Wait_ " + i);
}
System.out.println();
System.out.println("Second started: " + Thread.currentThread().getName());
//inThrd.start();
}
public static void waitThrd(){
synchronized(obj){
try {
obj.wait(10000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
public static void notifyThrd(){
synchronized(obj){
obj.notify();
}
}
static class InnerThread extends Thread {
public void run(){
for(int i=10; i<20; i++){
if(i>=15) notifyThrd();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
};
System.out.println(" Thread_ " + i);
}
}
}
}
#################################################################################
此外在这里需要说明的是,需要在对象上调用wait()方法和notify()方法,而不是在线程上调用该方法;
#################################################################################
java.lang.IllegalMonitorStateException 违法的监控状态异常。
当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
这是网上的解释,我不是很明白,什么叫“自己并不拥有的对象”,我是在一个对象调用wait();在另一个对象调用notifyAll()
------解决方法--------------------------------------------------------
如果不正确地管理wait/notify调用,应用程序可能会抛出IllegalMonitorStateException,例如,若不拥有对象的锁标记,而试图用wait/notify协调共享对象资源,应用程序将抛出IllegalMonitorStateException。
IllegalMonitorStateException意味着一个或多个资源可能不再处于一致状态,表示程序出现了严重问题。由于IllegalMonitorStateException是RuntimeException类型,因此它可能中断产生异常的线程。