发段有意思的代码共同学习下

stu202060510 2010-03-08 12:24:09
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;猜猜会发生什么......

如果我解释的有问题的话,请高手指点下
...全文
175 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweetBug 2010-03-09
  • 打赏
  • 举报
回复
学习了,有意思的代码!
netsnooper 2010-03-09
  • 打赏
  • 举报
回复
什么什么什么什么东西??
orangemike 2010-03-09
  • 打赏
  • 举报
回复
引用 5 楼 stu202060510 的回复:
引用 2 楼 orangemike 的回复:
1.你的这种写法就不准确,sleep是类方法.本就应该由类来调用.你写成一个对象实例,但是实际根本不用它

try {
    hardy.sleep(1000);
} catch (InterruptedException e) {
    System.out.println("b");
}

2.wait()出错,和是不是静态方法也没有本质联系.
你去查一下 IllegalMonitorStateException 是什么意思.
通常没人会写出这代码,但面试题和考证书的时候会有这种题目。

我注明wait不是静态方法是针对于sleep而言的

这段代码抛异常是因为laurel已经调用了sleep(),而hardy中又调用了laurel.wait();所以抛异常。

对于抛出的异常我也不不是太明白,抛出的是运行期异常,而非catch中的InterruptedException。
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方法调用石油条件的.


JavaAlpha 2010-03-09
  • 打赏
  • 举报
回复
引用 8 楼 stu202060510 的回复:
引用 7 楼 py330316117 的回复:以前一直都没关注过“Eclipse等IDE环境中会提示警告”,通常我会忽略警告的,学习了... 你太有才,不用ide开发java的程序员不是好的程序员
我用Myeclipse,不过我确实很少关注其中Line Number左边是否黄色的三角,只要没红色就OK了


对 程序员关注的是Erro不是Warnings
liguang168 2010-03-09
  • 打赏
  • 举报
回复
看过。。。。。。。。。。。。。。。。。。。。。。。
yzb123 2010-03-09
  • 打赏
  • 举报
回复
不管你这个类是否是 线程类, wait方法都可用, 但是前提是:wait方法必须放进同步控制(synchronized)方法或同步控制块中。
orangemike 2010-03-08
  • 打赏
  • 举报
回复

1.你的这种写法就不准确,sleep是类方法.本就应该由类来调用.你写成一个对象实例,但是实际根本不用它

try {
hardy.sleep(1000);
} catch (InterruptedException e) {
System.out.println("b");
}

2.wait()出错,和是不是静态方法也没有本质联系.
你去查一下 IllegalMonitorStateException 是什么意思.

静态方法最好还是叫做类方法.类方法,对象方法,更便于理解本质.


poFate 2010-03-08
  • 打赏
  • 举报
回复
我感觉hardy.sleep(1000);这边运行肯定会出错,因为hardy可能为null,?
在这段代码里面 它为什么会是null?在你start之前 你不是已经new过了吗
帮顶
stu202060510 2010-03-08
  • 打赏
  • 举报
回复
引用 7 楼 py330316117 的回复:
以前一直都没关注过“Eclipse等IDE环境中会提示警告”,通常我会忽略警告的,学习了...

你太有才,不用ide开发java的程序员不是好的程序员

我用Myeclipse,不过我确实很少关注其中Line Number左边是否黄色的三角,只要没红色就OK了
py330316117 2010-03-08
  • 打赏
  • 举报
回复
以前一直都没关注过“Eclipse等IDE环境中会提示警告”,通常我会忽略警告的,学习了...

你太有才,不用ide开发java的程序员不是好的程序员
stu202060510 2010-03-08
  • 打赏
  • 举报
回复
引用 4 楼 chdw 的回复:
hardy.sleep(1000);
这段话在Eclipse等IDE环境中会提示警告的

因为它会被编译器修改为Thread.sleep(1000),也就是你前面写哪个Thread对象都一样的,没有区别。所以也不可能出现NullPointerException的问题

以前一直都没关注过“Eclipse等IDE环境中会提示警告”,通常我会忽略警告的,学习了...
stu202060510 2010-03-08
  • 打赏
  • 举报
回复
引用 2 楼 orangemike 的回复:
1.你的这种写法就不准确,sleep是类方法.本就应该由类来调用.你写成一个对象实例,但是实际根本不用它

try {
    hardy.sleep(1000);
} catch (InterruptedException e) {
    System.out.println("b");
}

2.wait()出错,和是不是静态方法也没有本质联系.
你去查一下 IllegalMonitorStateException 是什么意思.

通常没人会写出这代码,但面试题和考证书的时候会有这种题目。

我注明wait不是静态方法是针对于sleep而言的

这段代码抛异常是因为laurel已经调用了sleep(),而hardy中又调用了laurel.wait();所以抛异常。

对于抛出的异常我也不不是太明白,抛出的是运行期异常,而非catch中的InterruptedException。
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)
非常感谢你的关注......
ChDw 2010-03-08
  • 打赏
  • 举报
回复
hardy.sleep(1000);
这段话在Eclipse等IDE环境中会提示警告的

因为它会被编译器修改为Thread.sleep(1000),也就是你前面写哪个Thread对象都一样的,没有区别。所以也不可能出现NullPointerException的问题
stu202060510 2010-03-08
  • 打赏
  • 举报
回复
引用 1 楼 pofate 的回复:
我感觉hardy.sleep(1000);这边运行肯定会出错,因为hardy可能为null,?
在这段代码里面 它为什么会是null?在你start之前 你不是已经new过了吗
帮顶

你说的是对的,我想错了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧