2.1 创建线程
创建多线程程序有两种常用方法:实现 Runnable 接口或继承 Thread 类。
2.1.1 实现Runnable接口
Runnable 接口是一个函数式接口,它只有一个方法 void run() 。
在自定义类中实现 run 方法,然后用自定义类的实例构造一个 Thread 对象,最后调用对象的 start 方法启动线程。用lambda表达式可以简化这个过程,方便地创建实例:
Runnable task = () -> {// 任务代码}var t = new Thread(task);t.start();
/*** 用lambda表达式创建线程*/public class ThreadTest {public static void main(String[] args) {Runnable task1 = () -> {try {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread() + "hello");Thread.sleep((int) (100 * Math.random()));}} catch (InterruptedException e) {}};Runnable task2 = () -> {try {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread() + "bye");Thread.sleep((int) (100 * Math.random()));}}catch (InterruptedException e) {}};new Thread(task1).start();new Thread(task2).start();}}
2.1.2 继承Thread
因为Thread类实现了Runnable接口,所以自定义类要重写run方法。为了简化创建线程的过程,可以用匿名内部类。
//实现一个Thread的子类,只使用一次new Thread() {@overridepublic void run() {//任务代码}}.start(); //线程启动
2.1.3 实现 Runnable 接口与 继承 Thread 相比有如下优势:
1、避免单继承带来的局限性;
2、任务与线程对象解耦,程序更健壮;
3、线程池技术不接受 Thread 的子类。
