java线程只能调用一次start,为什么线程池的线程可以重复调用,同一个线程可以执行多次任务呢?

85 阅读1分钟

单一线程的生命周期

在Java中,一个普通的线程(Thread对象)的生命周期是这样的:

  1. 新建(New) :线程对象被创建,但尚未调用start()方法。
  2. 就绪(Runnable) :调用start()方法后,线程进入就绪状态,等待CPU调度。
  3. 运行(Running) :线程获得CPU时间片,开始执行run()方法中的代码。
  4. 阻塞(Blocked) :线程因为某些原因(如等待I/O、锁等)暂时停止执行。
  5. 终止(Terminated) :线程的run()方法执行完毕或抛出异常,线程进入终止状态。

一旦线程进入终止状态,就不能再调用start()方法重新启动。如果尝试调用,会抛出IllegalThreadStateException

线程池中的线程生命周期

线程池中的线程生命周期与普通线程有所不同,主要体现在线程的复用上:

  1. 新建(New) :线程池创建线程时,线程处于新建状态。
  2. 就绪(Runnable) :线程被启动后,进入就绪状态,等待任务。
  3. 运行(Running) :线程从任务队列中获取任务并执行。
  4. 空闲(Idle) :线程执行完任务后,不会进入终止状态,而是回到空闲状态,等待下一个任务。
  5. 终止(Terminated) :当线程池关闭或线程被显式终止时,线程进入终止状态。

关键区别

  • 普通线程:执行完run()方法后,线程进入终止状态,无法再次启动。
  • 线程池线程:执行完任务后,线程不会终止,而是回到空闲状态,等待下一个任务。线程池通过这种方式实现了线程的复用。

代码示例