无论有多少种形式,创建多线程的真正的方法,
其实只有两种:
> 继承 Thread 类
> 实现 Runnable 接口
其它形式都是这两种方式的变体。
1、继承 Thread 类
1.1实现方式
第一步:继承 Thread 类
第二步:重写 run() 方法
第三步:创建 Thread 子类对象
第四步:调用 start() 方法启动线程\
1.2.start() 方法和 run() 方法区别
调用 run() 方法仅仅只是调用了一个子类中重写的父类方法,并没有真正开启一个新的线程,还是在当前线程运行,也就是 main 线程。
1.3.建议
因为 Java 是单继承的,一个类继承了 Thread 类就不能继承其它类,所以通常不采用这个办法创建多线程。
2、实现 Runnable 接口
①实现 Runnable 接口形式
public class CreateThread02Impl {
public static void main(String[] args) {
// 第四步:创建实现了 Runnable 接口的类的对象
MyRunnableThread runnable = new MyRunnableThread();
// 第五步:创建 Thread 类对象
// 参数1:runnable 对象
// 参数2:线程名称
Thread thread = new Thread(runnable, "thread 002");
// 第六步:调用 Thread 对象的 start() 方法启动线程
thread.start();
}
}
// 第一步:实现 Runnable 接口
class MyRunnableThread implements Runnable {
// 第二步:实现 run() 方法
@Override
public void run() {
// 第三步:编写线程中的逻辑代码
System.out.println(Thread.currentThread().getName() + " is working");
}
}
②匿名内部类形式
// 第一步:以匿名内部类的方式创建 Runnable 接口类型的对象
Runnable runnable = new Runnable() {
@Override
public void run() {
// 第二步:编写线程中的逻辑代码
System.out.println(Thread.currentThread().getName() + " is working");
}
};
// 第三步:创建 Thread 类对象
// 参数1:runnable 对象
// 参数2:线程名称
Thread thread = new Thread(runnable, "thread 003");
// 第四步:调用 Thread 对象的 start() 方法启动线程
thread.start();
③Lambda 表达式形式
// 编写 Lambda 表达式的口诀:
// 复制小括号
// 写死右箭头
// 落地大括号
// 第一步:以匿名内部类的方式创建 Runnable 接口类型的对象
Runnable runnable = () -> {
// 第二步:编写线程中的逻辑代码
System.out.println(Thread.currentThread().getName() + " is working");
};
// 第三步:创建 Thread 类对象
// 参数1:runnable 对象
// 参数2:线程名称
Thread thread = new Thread(runnable, "thread 004");
// 第四步:调用 Thread 对象的 start() 方法启动线程
thread.start();