单一线程的生命周期
在Java中,一个普通的线程(Thread对象)的生命周期是这样的:
- 新建(New) :线程对象被创建,但尚未调用
start()方法。 - 就绪(Runnable) :调用
start()方法后,线程进入就绪状态,等待CPU调度。 - 运行(Running) :线程获得CPU时间片,开始执行
run()方法中的代码。 - 阻塞(Blocked) :线程因为某些原因(如等待I/O、锁等)暂时停止执行。
- 终止(Terminated) :线程的
run()方法执行完毕或抛出异常,线程进入终止状态。
一旦线程进入终止状态,就不能再调用start()方法重新启动。如果尝试调用,会抛出IllegalThreadStateException。
线程池中的线程生命周期
线程池中的线程生命周期与普通线程有所不同,主要体现在线程的复用上:
- 新建(New) :线程池创建线程时,线程处于新建状态。
- 就绪(Runnable) :线程被启动后,进入就绪状态,等待任务。
- 运行(Running) :线程从任务队列中获取任务并执行。
- 空闲(Idle) :线程执行完任务后,不会进入终止状态,而是回到空闲状态,等待下一个任务。
- 终止(Terminated) :当线程池关闭或线程被显式终止时,线程进入终止状态。
关键区别
- 普通线程:执行完
run()方法后,线程进入终止状态,无法再次启动。 - 线程池线程:执行完任务后,线程不会终止,而是回到空闲状态,等待下一个任务。线程池通过这种方式实现了线程的复用。