黑马程序员技术交流社区

标题: 异常类与多线程的问题 [打印本页]

作者: 闫宽    时间: 2013-6-3 16:19
标题: 异常类与多线程的问题
本帖最后由 闫宽 于 2013-6-4 11:19 编辑
  1. public class ep7_4 {

  2.         public static void main(String[] args) {
  3.                 B a = new B();
  4.                 a.student.start();
  5.                 a.teacher.start();
  6.         }
  7. }

  8. class B implements Runnable {
  9.         Thread student, teacher;

  10.         B() {
  11.                 teacher = new Thread(this);
  12.                 student = new Thread(this);
  13.                 teacher.setName("王教授");
  14.                 student.setName("张三");
  15.         }

  16.         public void run() {
  17.                 if (Thread.currentThread() == student) {
  18.                         try {
  19.                                 System.out.println(student.getName() + "正在睡觉,不听课");
  20.                                 Thread.sleep(1000 * 60 * 60);
  21.                         } catch (InterruptedException e) {
  22.                                 System.out.println(student.getName() + "被老师叫醒了");
  23.                         }
  24.                         System.out.println(student.getName() + "开始听课");
  25.                 } else if (Thread.currentThread() == teacher) {
  26.                         for (int i = 1; i <= 3; i++) {
  27.                                 System.out.println("上课");
  28.                                 try {
  29.                                         Thread.sleep(500);
  30.                                 } catch (InterruptedException e) {
  31.                                         // TODO Auto-generated catch block
  32.                                         e.printStackTrace();
  33.                                 }
  34.                         }
  35.                         student.interrupt();// 吵醒student
  36.                 }
  37.         }
  38. }
复制代码
其中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