创建和启动线程,传统有两种方式
方式1、继承 Thread 类
方式2、实现 Runnable 接口
线程类(java.lang.Thread):Thread 类和 Thread 的子类才能称之为线程类。
主线程:main 方法运行,表示主线程。
方式1:继承 Thread 类,步骤:
1.定义一个类 A 继承与 java.lang.Thread 类
2.在 A 类中覆盖Thread类中的run方法
3.在 run 方法中编写需要执行的操作 --> run 方法里的线程执行体
4.在 main 方法(线程)中,创建线程对象,并启动线程
创建线程类: A类 a = new A 类();
调用线程对象的 start 方法: a.start(); // 启动一个线程
注:千万不要调用 run 方法,如果调用 run 方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程。
方式2:实现 Runnable 接口,步骤
1.定义一个类 A 实现与 java.lang.Runnable 接口,注意 A类不是线程类。
2.在 A 类中覆盖 Runnable 接口的 run 方法。
3.在 run 方法中编写需要执行的操作 --> run 方法里的线程执行体。
4.在 main 方法(主线程)中,创建线程对象,并启动线程。
创建线程类对象:Thread t = new Thread(new A类());
调用线程对象的 start 方法: t.start();
使用匿名内部类来创建线程,只适用于某一类只使用一次的情况。
Thread.currentThread()
static Thread currentThread(); // 返回对当前正在执行的线程对象的引用。
如 Thread t = Thread.currentThread();
String name = Thread.currentThread().getName();
继承方式和实现方式的区别
继承方式:
1.Java 中类是单继承的,如果继承了 Thread 类,就不能再有其他的直接父类
2.从操作分析,继承方式更简单,获取线程名字也简单(操作上更简单)
3.从多线程共享同一个资源上分析,继承方式不能做到。
实现方式:
1.Java 中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口(设计上,更优雅)。
2.从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用 Thread.currentThread()来获取当前线程的引用。
3.从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源)。
在线程的 run 方法上不能使用 throws 来声明抛出异常,只能在方法中使用 try-catch 来处理异常。
原因:子类覆盖父类方法的原则,子类不能抛出新的异常。
在 Runnable 接口中的 run 方法,都没有声明抛出异常:
public abstract void run();