A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 洪建超 于 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)

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

2 个回复

倒序浏览
  1. package Day17;
  2. public class Test2 {
  3.         public static void main(String[] args) {
  4.           Test2 ex=new Test2();
  5.           ex.go();
  6.         }
  7.         public void go(){
  8.           MyThread mt=new MyThread("one");
  9.           mt.start();
  10.         }
  11.         }

  12.         class MyThread extends Thread{
  13.         private String name="";
  14.         MyThread(String s){
  15.           name=s;
  16.         }
  17.         public void run(){
  18.           notwait();  
  19.           System.out.println("finished");
  20.         }
  21.         public void notwait(){
  22.           while(true){
  23.            try{
  24.             System.out.println("waiting");
  25.             wait();
  26.            }
  27.            catch(Exception e){}// InterruptedException//线程中断异常.这里不能用这个类
  28.            System.out.println(name);
  29.           }
  30.         }
  31.         }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
wait与notify方法都是定义在Object类中,而且是final的,因此会被所有的Java类所继承并且无法重写。
这两个方法要求在调用时线程应该已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或块当中
当线程执行了wait方法时,它会释放掉对象的锁。
因而,你起了这个线程,没有设置同步方法或同步代码块,因而它不会涉及wait和notify的问题。
再看这个异常的api说明:
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
监视器即锁,没有synchronized方法或者代码块,因而没有监视器,你调用wait()当然抛出异常了。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马