黑马程序员技术交流社区
标题:
异常类与多线程的问题
[打印本页]
作者:
闫宽
时间:
2013-6-3 16:19
标题:
异常类与多线程的问题
本帖最后由 闫宽 于 2013-6-4 11:19 编辑
public class ep7_4 {
public static void main(String[] args) {
B a = new B();
a.student.start();
a.teacher.start();
}
}
class B implements Runnable {
Thread student, teacher;
B() {
teacher = new Thread(this);
student = new Thread(this);
teacher.setName("王教授");
student.setName("张三");
}
public void run() {
if (Thread.currentThread() == student) {
try {
System.out.println(student.getName() + "正在睡觉,不听课");
Thread.sleep(1000 * 60 * 60);
} catch (InterruptedException e) {
System.out.println(student.getName() + "被老师叫醒了");
}
System.out.println(student.getName() + "开始听课");
} else if (Thread.currentThread() == teacher) {
for (int i = 1; i <= 3; i++) {
System.out.println("上课");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
student.interrupt();// 吵醒student
}
}
}
复制代码
其中run方法怎么理解?try--catch中的catch在什么情况下被执行??
System.out.println(student.getName() + "开始听课");这个怎么被执行?
作者:
youngster
时间:
2013-6-3 16:33
那条打印语句if符合就执行,
run方法里处理了当异常时学生类时候时出现的各种情况,对异常进行了try catch处理,
catch捕获异常,就是要执行的,没有说什么时候执行,它在那里等着捕获异常,它的功能就是捕获。
给楼主小结异常处理机制:
异常的处理原则:
* 1,处理方式有两种:try或throw
* 2,调用到抛出异常的功能时,抛出几个就处理几个
* 一个try对应多个catch。
* 3,多个catch,父类的catch放到最下边。
* 4,catch内需要定义针对性的处理方式,不要简单的定义printStackTrace,输出语句,也不要不写。
* 当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
*
* 如果该异常处理不了,但并不属于改功能出现的异常,可以将该异常转换后再抛出和该功能相关的异常 * 如果该异常可以处理,但需要将异常产生的和本功能相关的问题提供出去让调用者知道,并处理,
* 也可以将捕获异常处理后,转换新的异常。
*
*1、既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。
*2、在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。不要试图处理所有可能出现的异常。
*3、保证所有资源都被正确释放。充分运用finally关键词。
作者:
闫宽
时间:
2013-6-3 17:06
youngster 发表于 2013-6-3 16:33
那条打印语句if符合就执行,
run方法里处理了当异常时学生类时候时出现的各种情况,对异常进行了try catch ...
run的方法执行过程如下:判断线程的名称是不是student 如果是的话“张三正在睡觉,不听课”,a然后student睡眠,下一步是神马??
作者:
杨兴庭
时间:
2013-6-3 18:02
二楼正解。。。老毕曾经说过不写注释的代码,就像写作文不加标点一样让人别扭。。。。
作者:
闫宽
时间:
2013-6-3 21:09
如果当前执行run方法的线程,是student线程,那么输出:“xxx 正在睡觉,不听课”,然后student线程会睡眠1小时。
如果当前执行run方法的线程,是teacher线程,那么输出三次“上课”,每次间隔500毫秒。
第三次结束后,调用线程student对象的interrupt()方法来中断student线程的睡眠。
这意味着,在“Thread.sleep(1000 * 60 * 60);”这行代码会抛出一个InterruptedException 异常,由于被抓住了,因此又会输出:“xxx被老师叫醒了”。
这个便是我的理解,原来理解的是sleep执行时就会有异常,现在才明白是InterruptedException 异常是在睡眠状态被打断情况下才会出现。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2