黑马程序员技术交流社区
标题:
做线程练习时遇到的错误,求大神指导!
[打印本页]
作者:
洪建超
时间:
2013-2-27 15:52
标题:
做线程练习时遇到的错误,求大神指导!
本帖最后由 洪建超 于 2013-2-27 23:11 编辑
public class Exercise {
public static void main(String[] args) {
Exercise ex=new Exercise();
ex.go();
}
public void go(){
MyThread mt=new MyThread("one");
mt.start();
}
}
class MyThread extends Thread{
private String name="";
MyThread(String s){
name=s;
}
public void run(){
notwait();
System.out.println("finished");
}
public void notwait(){
while(true){
try{
System.out.println("waiting");
wait();
}
catch(InterruptedException e){}
System.out.println(name);
}
}
}
结果为
waiting
以下是运行异常显示的东东
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at mypackage.MyThread.notwait(Exercise.java:34)
at mypackage.MyThread.run(Exercise.java:24)
作者:
陈圳
时间:
2013-2-27 16:11
package Day17;
public class Test2 {
public static void main(String[] args) {
Test2 ex=new Test2();
ex.go();
}
public void go(){
MyThread mt=new MyThread("one");
mt.start();
}
}
class MyThread extends Thread{
private String name="";
MyThread(String s){
name=s;
}
public void run(){
notwait();
System.out.println("finished");
}
public void notwait(){
while(true){
try{
System.out.println("waiting");
wait();
}
catch(Exception e){}// InterruptedException//线程中断异常.这里不能用这个类
System.out.println(name);
}
}
}
复制代码
作者:
王钊
时间:
2013-2-27 16:29
wait与notify方法都是定义在Object类中,而且是final的,因此会被所有的Java类所继承并且无法重写。
这两个方法要求在调用时线程应该已经获得了对象的锁,因此对这两个方法的调用
需要放在synchronized方法或块当中
。
当线程执行了wait方法时,它会释放掉对象的锁。
因而,你起了这个线程,没有设置同步方法或同步代码块,因而它不会涉及wait和notify的问题。
再看这个异常的api说明:
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
监视器即锁,没有synchronized方法或者代码块,因而没有监视器,你调用wait()当然抛出异常了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2