黑马程序员技术交流社区
标题:
多线程发生异常问题,求解
[打印本页]
作者:
。。。。。。。
时间:
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修饰的)的代码块中。比如:
synchronized (r) //r是锁
{
if(!r.flag)
try {
r.wait();
} catch (InterruptedException e) {
throw new RuntimeException("Output Got it");
}
System.out.println(r.name+"+++"+r.gender);
r.flag = false;
r.notify();//唤醒对方线程
}
复制代码
当然,使用interrupt方法也会打断线程的暂停状态,可以对wait中的线程传达"不用等notify/notifyAll了,从等待中出来"的信号.但是当线程wait时,有一点需要注意的,那就是锁的问题.线程进入等待状态时,会将自己拥有的锁释放,当对wait中的线程调用interrupt方法是,等待线程会重新获取锁,然后再抛出interruptedException.获取锁定之前,并无法抛出InterruptedException异常. 比如当线程t调用interrupt方法是,线程代码块中会检测出中断异常,并马上抛出。
t.start();
t.interrupt();
复制代码
当中断方法执行后,参照第一段代码:则会出现以下的异常信息:
<font color="#ff0000">Exception in thread "Thread-0" java.lang.RuntimeException: Input Got it
at com.intel.thread.Input.run(ThreadCommunication.java:39)
at java.lang.Thread.run(Thread.java:619)</font>
AAA+++male
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2