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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史政法 中级黑马   /  2013-2-22 11:58  /  1298 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



  1. class StopThread implements Runnable
  2. {
  3.         private boolean flag = true;
  4.         public synchronized void run()
  5.         {
  6.                 while(flag)
  7.                 {
  8.                         try
  9.                         {
  10.                                 wait();//这个方法都做了什么事情?为什么interrupt()方法清除过冻结状态后,会抛出和接收到InterruptedException异常呢?
  11.                         }
  12.                         catch (InterruptedException e)
  13.                         {
  14.                                 System.out.println(Thread.currentThread().getName()+"...InterruptedException");
  15.                                 changeFlag();
  16.                         }
  17.                         System.out.println(Thread.currentThread().getName()+"...run");
  18.                 }
  19.         }
  20.         public void changeFlag()
  21.         {
  22.                 flag = false;
  23.         }
  24. }

  25. class StopThreadDemo
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 StopThread st = new StopThread();

  30.                 Thread t1 = new Thread(st);
  31.                 Thread t2 = new Thread(st);

  32.                 t1.start();
  33.                 t2.start();

  34.                 int num = 0;

  35.                 while(true)
  36.                 {
  37.                         if (num++ ==60 )
  38.                         {
  39.                                 t1.interrupt();//这个方法都做了什么事情?
  40.                                 t2.interrupt();
  41.                                 break;
  42.                         }
  43.                         System.out.println(Thread.currentThread().getName()+"..."+num);
  44.                 }
  45.         }
  46. }
复制代码
我不明白的是wait()和interrupt()方法,为什么清除过冻结状态后,刚好会被wait方法抛出和接收到InterruptedException异常呢?这两个方法到底在搞什么名堂?一个是Object里面被继承过来的,一个是Thread类里面的方法,怎么配合的那么默契,他抛什么他接什么,并且直接处理掉了?

3 个回复

倒序浏览
因为Object是上帝,所有的类都是他的子类,所以这么默契啊,
主要是由于try{}carth{},当线程被中断之后,try{}就检测到了有问题,
然后就交给专门处理异常的carch{},这时carch 就会告诉你哪里错了
我想jvm就是这么设计的
纯属个人观点
回复 使用道具 举报
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

回复 使用道具 举报
t1.interrupt(); //这个做了中断线程的操作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马