黑马程序员技术交流社区

标题: 多线程发生异常问题,求解 [打印本页]

作者: 。。。。。。。    时间: 2013-11-7 18:07
标题: 多线程发生异常问题,求解
try{
   wait();
}catch(Exception){
    System.out.println("发生了异常");
}
当线程执行到wait()方法时,会被冻结,那么异常是不是也被冻结了不抛出呢?
当interrupt()时,恢复了被冻结的线程,那么这时候异常就继续被抛出了吗?

作者: qixing0918    时间: 2013-11-7 18:37
我感觉 wait(); 是等待  停止了 不执行了也没有错误    为什么抛异常啊
interrupt()唤醒线程 如果下面的代码有错误才抛异常  

作者: 青年黨衛軍    时间: 2013-11-8 15:27
基础视频中线程通信那个代码好像与卤煮的问题相似,不知能不能帮到卤煮消除疑惑。

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
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2