线程的生命周期

  • 线程的生命周期主要有七个状态:
    • 新建(New)
    • 就绪(Runnable)
    • 运行(Running)
    • 阻塞(Blocked)
    • 等待(Waiting)
    • 超时等待(Timed Waiting)
    • 终止(Terminated)
  • Java中将操作系统中的
    • 就绪状态/运行状态转化为一个状态Runnable
    • 阻塞状态细分为了三种
      • BlOCKED
      • WAITING
      • TIMED_WAITING

1. 新建(New)

  • 线程对象被创建但尚未启动。使用new Thread()创建线程后,线程处于新建状态。

2. 就绪(Ready)

  • 线程已经被启动,等待系统资源。使用start()方法启动线程后,线程进入就绪状态,等待CPU调度。

3. 运行(Running)

  • 线程获得CPU时间片,开始执行run()中的代码。

4. 阻塞(Blocked)

  • 现成因为某些原因放弃了CPU使用权。可能是等待某个资源、等待I/O操作完成、或者调用sleep()等。

5. 等待(Waiting)

  • 线程进入等待状态,直到被其他线程唤醒。可以通过调用Object.wait()Thread.join()LockSupport.park()方法进入等待状态。

6. 超时等待(Timed Waiting)

  • 线程等待一段时间,当时间到达或者其他条件满足时,线程会重新进入就绪状态。通过Thread.sleep()Object.wait(timeout)Thread.join(timeout)LockSupport.parkNanos()等方式可进入超时等待状态。

7. 终止(Terminated)

  • 线程执行完run()方法或者因异常退出后,进入终止状态。

8. 线程生命周期图示


  • 注意:在操作系统层面线程有ReadyRunning两个状态,在JVM层面,只能看到Runnable状态,这是因为现在的操作系统基本上都是使用“时间分片”方式进行抢占式轮转调度,而时间分片通常都很小,线程切换太快,区分这两种状态就没意义了