Java线程的生命周期、状态转换、线程调度
Java线程的生命周期描述了一个线程从创建到终止的整个过程,包括不同状态之间的转换以及线程调度的机制。
一、Java线程的生命周期
Java线程的生命周期包括以下几个状态:
- 新建状态(New):当线程对象被创建但还
未调用start()方法
时,线程处于新建状态。 - 就绪状态(Runnable):当线程调用start()方法后,线程进入
就绪状态
,等待获取CPU时间片
执行。 - 运行状态(Running):当线程
获取到CPU时间片
并开始执行时,线程处于运行状态。 - 阻塞状态(Blocked):线程在
等待某个条件满足
时会进入阻塞状态,如等待I/O操作完成
、获取锁
等。 - 等待状态(Waiting):线程调用
wait()
方法、join()
方法、park()
方法等时会进入等待状态。 - 超时等待状态(Timed Waiting):线程调用带有
超时参数
的方法(如Thread.sleep()、Object.wait())时会进入超时等待状态
。 - 终止状态(Terminated):线程
执行完任务
或调用stop()
方法终止时进入终止状态。
线程的状态可以使用
thread.getState()
获取
二、线程状态转换
线程在不同状态之间转换的过程如下:
- 新建状态 -> 就绪状态:
调用start()方法
- 就绪状态 -> 运行状态:
获取CPU时间片
- 运行状态 -> 就绪状态:
时间片用完
或主动调用yield()方法
- 运行状态 -> 阻塞状态:等待
I/O操作
、获取锁
等 - 阻塞状态 -> 就绪状态:
条件满足
- 就绪状态 -> 终止状态:执行完任务或调用stop()方法
三、线程调度
Java线程调度由操作系统和Java虚拟机共同完成
,操作系统负责将CPU时间片分配给不同线程,Java虚拟机负责根据线程的状态和优先级
来进行调度,也就是说线程的优先执行主要还是取决于操作系统是否分配了CPU时间片
,线程调度可以通过设置线程的优先级、使用synchronized关键字等机制来影响。
代码如下:
java
public class ThreadLifecycleExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("Thread is running");
});
System.out.println("Thread state: " + thread.getState()); // 输出线程状态
thread.start(); // 启动线程
System.out.println("Thread state after start(): " + thread.getState());
try {
Thread.sleep(1000); // 主线程休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread state after 1 second: " + thread.getState());
}
}