在Java中,线程的生命周期描述了线程从创建到消亡的过程。这个过程可以大致分为以下几个状态:
1. **新建状态(New)**:当线程对象被创建但尚未启动,即调用`start()`方法之前,线程处于新建状态。
2. **就绪状态(Runnable)**:线程对象创建后,其他线程调用了该对象的`start()`方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权。
3. **运行状态(Running)**:线程获得CPU资源正在执行任务(包括运行中的线程的CPU时间片用完后再被调度回到就绪状态),此时线程处于运行状态。
4. **阻塞状态(Blocked)**:线程因为某种原因(如等待I/O操作完成)放弃了CPU使用权,暂时停止运行,此时线程处于阻塞状态,直到其进入到就绪状态,才有机会再次被CPU选中进入运行状态。阻塞的情况分三种:
- 等待阻塞(等待某个条件发生,如`Object.wait()`)
- 同步阻塞(获取对象的同步锁)
- 其他阻塞(如`Thread.sleep()`或`Thread.join()`)
5. **等待状态(Waiting)**:线程进入等待状态是因为调用了没有设置Timeout参数的`Object.wait()`方法。进入等待状态的线程需要依靠其他线程的通知或中断才能够返回到就绪状态。
6. **超时等待状态(Timed Waiting)**:线程进入超时等待状态是因为调用了设置了Timeout参数的`Thread.sleep()`或`Object.wait(long timeout)`方法。线程在等待一定的时间后会被自动唤醒。
7. **终止状态(Terminated)**:线程执行完毕或因异常退出,线程生命周期结束,线程终止。
这些状态之间的转换并不是完全线性的,线程可以在运行时根据需要进行状态的转换。
下面是一个简单的Java多线程示例,展示了线程的创建和启动:
public class ThreadLifecycleExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
// 模拟线程执行的任务
System.out.println("线程运行中...");
try {
// 模拟线程阻塞
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程执行完毕");
});
// 线程处于新建状态
System.out.println("线程创建完成,尚未启动");
// 启动线程,线程进入就绪状态,等待CPU调度
thread.start();
// 注意:主线程不会等待子线程完成,因此主线程会继续执行后续代码
// 在实际应用中,可能需要通过join()等方法等待线程完成
}
}
请注意,上述代码仅展示了线程从新建到运行状态的基本过程,并未涵盖所有可能的状态转换。