public class Test {
static Thread laurel,hardy;
public static void main(String[] args) {
laurel=new Thread(){
public void run(){
try {
hardy.sleep(1000);
} catch (InterruptedException e) {
System.out.println("b");
}
System.out.println("c");
}
};
hardy=new Thread(){
public void run(){
System.out.println("d");
try {
laurel.wait();
} catch (InterruptedException e) {
System.out.println("e");
}
System.out.println("f");
}
};
laurel.start();
hardy.start();
}
} 第一眼看到这个代码,我感觉hardy.sleep(1000);这边运行肯定会出错,因为hardy可能为null,可惜不是这么回事。由于sleep()是一个静态方法,它影响的是当前线程,也就是laurel(即使对hardy调用也一样),这容易让人误解,但却合法。
理解了上面一点,你就会发现这段代码的问题所在,hardy尝试调用laurel.wait(),这时会发生IllegalMonitorStateException。(wait()不是静态方法)。有兴趣的可以将static Thread laurel,hardy;这段定义放入main()中改为Thread laurel,hardy;猜猜会发生什么......如果我解释的有问题的话,请高手指点下
static Thread laurel,hardy;
public static void main(String[] args) {
laurel=new Thread(){
public void run(){
try {
hardy.sleep(1000);
} catch (InterruptedException e) {
System.out.println("b");
}
System.out.println("c");
}
};
hardy=new Thread(){
public void run(){
System.out.println("d");
try {
laurel.wait();
} catch (InterruptedException e) {
System.out.println("e");
}
System.out.println("f");
}
};
laurel.start();
hardy.start();
}
} 第一眼看到这个代码,我感觉hardy.sleep(1000);这边运行肯定会出错,因为hardy可能为null,可惜不是这么回事。由于sleep()是一个静态方法,它影响的是当前线程,也就是laurel(即使对hardy调用也一样),这容易让人误解,但却合法。
理解了上面一点,你就会发现这段代码的问题所在,hardy尝试调用laurel.wait(),这时会发生IllegalMonitorStateException。(wait()不是静态方法)。有兴趣的可以将static Thread laurel,hardy;这段定义放入main()中改为Thread laurel,hardy;猜猜会发生什么......如果我解释的有问题的话,请高手指点下
1.你的这种写法就不准确,sleep是类方法.本就应该由类来调用.你写成一个对象实例,但是实际根本不用它try {
hardy.sleep(1000);
} catch (InterruptedException e) {
System.out.println("b");
}2.wait()出错,和是不是静态方法也没有本质联系.
你去查一下 IllegalMonitorStateException 是什么意思.静态方法最好还是叫做类方法.类方法,对象方法,更便于理解本质.
这段话在Eclipse等IDE环境中会提示警告的因为它会被编译器修改为Thread.sleep(1000),也就是你前面写哪个Thread对象都一样的,没有区别。所以也不可能出现NullPointerException的问题
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Test$2.run(Test.java:20)
非常感谢你的关注......
你把
hardy=new Thread(){
public void run(){
System.out.println("d");
try {
laurel.wait();
} catch (InterruptedException e) {
System.out.println("e");
}
System.out.println("f");
}
};改为:
hardy=new Thread(){
public void run(){
System.out.println("d");
try {
synchronized(laurel) {
laurel.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("e");
}
System.out.println("f");
}
};跑一下.注意wait方法调用石油条件的.
对 程序员关注的是Erro不是Warnings