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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NewDemo 中级黑马   /  2014-5-5 10:13  /  1439 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 NewDemo 于 2014-5-5 12:25 编辑
  1. public class ThreadTest1 {

  2.         /**
  3.          * @param args
  4.          *            储户存钱问题,分清楚哪些是共享数据,哪些代码是可能出现问题的,哪些代码需要被同步
  5.          */
  6.         public static void main(String[] args) {
  7.                 Bank b = new Bank();
  8.                 new Thread(new Customer(b)).start();
  9.                 new Thread(new Customer(b)).start();
  10.                 new Thread(new Customer(b)).start();
  11.         }
  12. }

  13. class Bank {
  14.         private int sum = 0;

  15.         Bank() {
  16.         }

  17.         public void add(int n) throws InterruptedException {// 这里操作了共享数据,但是有多句话,
  18.                 // 所以可能会出现安全问题,可让单个线程sleep的方式使问题突出
  19.                 sum = sum + n;
  20.                 Thread.sleep(100);
  21.                 System.out.println(Thread.currentThread().getName() + "..." + sum);
  22.         }
  23. }

  24. class Customer implements Runnable {
  25.         private Bank b;

  26.         Customer(Bank b) {
  27.                 this.b = b;
  28.         }

  29.         @Override
  30.         public void run() {
  31.                 for (int x = 0; x < 3; x++) {// 这里操作了共享数据,但是只有一句话,不会出现安全问题,
  32.                         // 但是如果在这里加一把锁的话也是可以的,但是对问题的处理阅读性较差
  33.                         try {
  34.                                 synchronized (Customer.class) {
  35.                                         b.add(100);
  36.                                 }
  37.                         } catch (InterruptedException e) {
  38.                                 e.printStackTrace();
  39.                         }// 上面线程sleep会出现异常,那里抛出了异常,这里也接着把异常抛给虚拟机不行吗,为什么一定要处理?
  40.                 }
  41.         }
  42. }
复制代码


{:2_30:}上面线程sleep会出现异常,那里抛出了异常,这里也接着把异常抛给虚拟机不行吗,为什么一定要处理?

4 个回复

倒序浏览
  1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
  2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
       3:如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
因为在多线程中Thread和 Runnable接口的run方法没有抛出异常,
所以实现或继承Thread和 Runnable接口之后,覆盖run方法时,也不能够抛出异常,必须要try{}catch(){}处理
下面是我的笔记,你可以看看
  1. import java.util.Scanner;

  2. /*创建线程的两种方法:
  3. *
  4. * 一:继承Thread类
  5. *                 1.定义类并继承Thread类;
  6. *                 2.覆盖Thread类中的run方法;
  7. *                 3.建立Thread子类对象;
  8. *                 4.使用start方法开启线程,并调用run方法。
  9. *
  10. * 二:实现Runnable接口
  11. *                 1.定义类实现Runnable接口;
  12. *                 2.覆盖Runnable接口的run方法;
  13. *                         将线程所要运行的代码存放在该run方法中;
  14. *                 3.通过Thread类建立线程对象;
  15. *                 4.将Runnable接口的子类对象传递给Thread类的构造函数。
  16. *                         为什么要将Runnable接口的子类对象传递给Thread的构造函数:
  17. *                                 因为,自定的run方法所属对象是Runnable接口的子类对象,所以
  18. *                                 要让线程去指定对象的run方法,就必须明确该run方法的所属对象。
  19. *                 5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
  20. *
  21. * 实现方式和继承方式有什么区别:
  22. *
  23. * 继承Thread:线程运行的代码存放在Thread子类run方法中。
  24. * 实现Runnable:线程运行的代码存放在接口的子类的run方法中。
  25. *
  26. * 实现方式的好处:避免了单继承的局限性。
  27. * 在定义线程是,建议使用实现方式。
  28. *
  29. * 多线程的安全问题:
  30. * 同步代码块:
  31. * synchronized(对象)
  32. * {
  33. *                 需要同步的代码。
  34. * }
  35. *
  36. * 同步的前提:
  37. * 1.必须要有两个或者两个以上的线程;
  38. * 2.必须是多个线程使用同一个锁;
  39. *
  40. * 好处:解决了多线程的安全问题
  41. * 弊端:多个线程需要判定,消耗资源。
  42. * */
  43. class xiancheng implements Runnable
  44. {
  45.         int x,y;
  46.         private int sum = 0;
  47.         xiancheng(int x,int y)
  48.         {
  49.                 this.x=x;
  50.                 this.y=y;
  51.         }

  52.         Object obj=new Object();
  53.         public void run()
  54.         {
  55.                 for(int a=0;a<x;a++)
  56.                 {
  57.                         synchronized(obj)
  58.                         {
  59.                                 sum+=y;
  60.                                 System.out.println(Thread.currentThread().getName() + "x=" +sum);
  61.                         }
  62.                 }
  63.         }
  64. }

  65. public class DuoXianCheng
  66. {

  67.         public static void main(String[] args)
  68.         {
  69.                 Scanner in=new Scanner(System.in);
  70.                 System.out.println("请输入要存储的次数:");
  71.                 int x=in.nextInt();
  72.                 System.out.println("请输入要存储的数目:");
  73.                 int y=in.nextInt();
  74.                 xiancheng a = new xiancheng(x,y);
  75.                 Thread t=new Thread(a);
  76.                 Thread tt=new Thread(a);
  77.                
  78.                 t.start();
  79.                 tt.start();

  80.         }
  81. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
skill20 发表于 2014-5-5 10:37
  1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异 ...

谢谢,问题解决
回复 使用道具 举报
fei_xiong 发表于 2014-5-5 10:37
因为在多线程中Thread和 Runnable接口的run方法没有抛出异常,
所以实现或继承Thread和 Runnable接口之后, ...

3q,看来很多只是还得自己遇到了才记得牢固
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马