线程的生命周期包括新建、就绪、运行、阻塞、等待、超时等待和终止七个阶段。这些阶段反映了一个线程在不同状态下的行为和状态转换。理解线程的生命周期有助于合理地管理线程,处理线程同步和并发问题,提高多线程编程的效率和可靠性。在实际的多线程应用中,对线程生命周期的合理控制是编写高效、健壮并发程序的重要一环。
1. 新建(New):
在这个阶段,线程对象被创建,但尚未启动。通过实例化Thread
类或其子类,或实现Runnable
接口并传递给Thread
构造器,可以创建一个新的线程对象。但是调用start()
方法之前,线程并不处于可运行状态。
2. 就绪(Runnable):
当调用线程的start()
方法后,线程进入就绪状态。此时线程已经准备好运行,但由于线程调度器的调度,它可能还没有开始执行。在就绪状态的线程有可能被调度为运行状态。
3. 运行(Running):
线程进入运行状态,开始执行run()
方法中的任务。线程可以在运行状态中执行自己的逻辑,完成任务。
4. 阻塞(Blocked):
线程可能在运行过程中由于某些原因而进入阻塞状态。可能的原因包括等待锁、等待I/O完成、调用sleep()
、yield()
等。在阻塞状态的线程不会被分配CPU执行时间,直到阻塞条件被解除。
5. 等待(Waiting):
线程在等待状态中等待某个条件满足。调用Object
的wait()
方法或join()
方法,或者调用Lock
接口的Condition
的await()
方法都会使线程进入等待状态。
synchronized (lock) { lock.wait(); // 线程等待}
6. 超时等待(Timed Waiting):
线程在限定时间内等待某个条件满足。调用sleep()
方法、join(long millis)
方法、Lock
接口的Condition
的await(long time, TimeUnit unit)
方法都会使线程进入超时等待状态。
try { Thread.sleep(1000); // 线程休眠} catch (InterruptedExceptione) { e.printStackTrace(); }
7. 终止(Terminated):
线程完成了它的任务,或者因为异常而提前退出。一个线程在以下情况之一发生时会进入终止状态:
run()
方法执行完成;- 线程抛出未捕获的异常。