什么是线程
线程是操作系统能够进⾏运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,可以使⽤多线程进⾏运算提速。
比如,一个线程完成一个任务需要100毫秒,改用十个线程完成该任务只需10毫秒
线程创建的两种方式
- 实现Runable接口
- 构建一个Thread类的子类(不推荐)
实现Runnable接口
// Runnable是一个函数式接口,可以用lambda表达式来创建实例
Runnable r = () -> {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
}
};
// 由Runnable创建一个Thread对象
Thread t = new Thread(r);
// 启动线程
t.start();
用Java8的lambda表达式创建比较方便,当然也可以创建一个实现Runnable接口的类。
创建一个Thread类的子类
不推荐该方法,应该将要并行运行的任务与运行机制解耦合
— 《Java核心技术 卷I》
class MyThread extends Thread {
@Override
public void run() {
System.out.println("task run");
}
}
然后,构造一个子类的对象,并调用start
方法启动线程。
线程的生命周期
创建一个Thread实例,处于新建状态。此时操作系统层面并没有创建线程。
只有调用了start
方法后,才产生了一个线程,并进入就绪状态。
CPU调度后线程进入运行状态,在该状态调用阻塞API或者等待某个事件时会进入阻塞状态。
进入阻塞状态的线程释放CPU使用权,直到阻塞事件结束,线程会切换到就绪状态(阻塞状态不可以直接进入到运行状态)
当线程执行完或出现异常,会进入终止状态,它不会切换到其他状态,意味着线程的生命周期结束了。