因为在多线程中Thread和 Runnable接口的run方法没有抛出异常,
所以实现或继承Thread和 Runnable接口之后,覆盖run方法时,也不能够抛出异常,必须要try{}catch(){}处理
下面是我的笔记,你可以看看
- import java.util.Scanner;
- /*创建线程的两种方法:
- *
- * 一:继承Thread类
- * 1.定义类并继承Thread类;
- * 2.覆盖Thread类中的run方法;
- * 3.建立Thread子类对象;
- * 4.使用start方法开启线程,并调用run方法。
- *
- * 二:实现Runnable接口
- * 1.定义类实现Runnable接口;
- * 2.覆盖Runnable接口的run方法;
- * 将线程所要运行的代码存放在该run方法中;
- * 3.通过Thread类建立线程对象;
- * 4.将Runnable接口的子类对象传递给Thread类的构造函数。
- * 为什么要将Runnable接口的子类对象传递给Thread的构造函数:
- * 因为,自定的run方法所属对象是Runnable接口的子类对象,所以
- * 要让线程去指定对象的run方法,就必须明确该run方法的所属对象。
- * 5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
- *
- * 实现方式和继承方式有什么区别:
- *
- * 继承Thread:线程运行的代码存放在Thread子类run方法中。
- * 实现Runnable:线程运行的代码存放在接口的子类的run方法中。
- *
- * 实现方式的好处:避免了单继承的局限性。
- * 在定义线程是,建议使用实现方式。
- *
- * 多线程的安全问题:
- * 同步代码块:
- * synchronized(对象)
- * {
- * 需要同步的代码。
- * }
- *
- * 同步的前提:
- * 1.必须要有两个或者两个以上的线程;
- * 2.必须是多个线程使用同一个锁;
- *
- * 好处:解决了多线程的安全问题
- * 弊端:多个线程需要判定,消耗资源。
- * */
- class xiancheng implements Runnable
- {
- int x,y;
- private int sum = 0;
- xiancheng(int x,int y)
- {
- this.x=x;
- this.y=y;
- }
- Object obj=new Object();
- public void run()
- {
- for(int a=0;a<x;a++)
- {
- synchronized(obj)
- {
- sum+=y;
- System.out.println(Thread.currentThread().getName() + "x=" +sum);
- }
- }
- }
- }
- public class DuoXianCheng
- {
- public static void main(String[] args)
- {
- Scanner in=new Scanner(System.in);
- System.out.println("请输入要存储的次数:");
- int x=in.nextInt();
- System.out.println("请输入要存储的数目:");
- int y=in.nextInt();
- xiancheng a = new xiancheng(x,y);
- Thread t=new Thread(a);
- Thread tt=new Thread(a);
-
- t.start();
- tt.start();
- }
- }
复制代码 |