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() {
@override
public void run() {
//任务代码
}
}.start(); //线程启动
2.1.3 实现 Runnable 接口与 继承 Thread 相比有如下优势:
1、避免单继承带来的局限性;
2、任务与线程对象解耦,程序更健壮;
3、线程池技术不接受 Thread 的子类。