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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 。。。。。。。 中级黑马   /  2013-11-7 18:07  /  1030 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

try{
   wait();
}catch(Exception){
    System.out.println("发生了异常");
}
当线程执行到wait()方法时,会被冻结,那么异常是不是也被冻结了不抛出呢?
当interrupt()时,恢复了被冻结的线程,那么这时候异常就继续被抛出了吗?

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
我感觉 wait(); 是等待  停止了 不执行了也没有错误    为什么抛异常啊
interrupt()唤醒线程 如果下面的代码有错误才抛异常  
回复 使用道具 举报
基础视频中线程通信那个代码好像与卤煮的问题相似,不知能不能帮到卤煮消除疑惑。

wait()方法:该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。需要注意的是wait()方法被线程被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。比如:
  1. synchronized (r) //r是锁
  2.                         {
  3.                                 if(!r.flag)
  4.                                         try {
  5.                                                 r.wait();
  6.                                         } catch (InterruptedException e) {
  7.                                                 throw new RuntimeException("Output Got it");
  8.                                         }
  9.                                 System.out.println(r.name+"+++"+r.gender);
  10.                                 r.flag = false;
  11.                                 r.notify();//唤醒对方线程
  12.                         }
复制代码
当然,使用interrupt方法也会打断线程的暂停状态,可以对wait中的线程传达"不用等notify/notifyAll了,从等待中出来"的信号.但是当线程wait时,有一点需要注意的,那就是锁的问题.线程进入等待状态时,会将自己拥有的锁释放,当对wait中的线程调用interrupt方法是,等待线程会重新获取锁,然后再抛出interruptedException.获取锁定之前,并无法抛出InterruptedException异常. 比如当线程t调用interrupt方法是,线程代码块中会检测出中断异常,并马上抛出。
  1. t.start();
  2. t.interrupt();
复制代码
当中断方法执行后,参照第一段代码:则会出现以下的异常信息:
  1. <font color="#ff0000">Exception in thread "Thread-0" java.lang.RuntimeException: Input Got it
  2.         at com.intel.thread.Input.run(ThreadCommunication.java:39)
  3.         at java.lang.Thread.run(Thread.java:619)</font>
  4. AAA+++male
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 很给力!

查看全部评分

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