Java线程的状态及转换

上面博客介绍了创建多线程的两种方式,下面介绍下Java线程的状态转换。

  1. 初始状态(NEW):实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。
  2. 可运行状态(RUNNABLE):线程对象创建后,其他线程比如main线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。
  3. 运行(RUNNING):可运行状态的线程获得了cpu时间片,执行程序代码
  4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu使用权,即让出时间片,暂时停止运行。直到线程进入可运行状态,才有机会再次获得cpu时间片转到运行状态。阻塞情况有三种:
    (1) 等待阻塞:运行的线程执行wait方法,JVM会把该线程放入等待队列中。
    (2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
    (3) 其他阻塞:运行的线程执行sleep或者join方法,或者发出了IO请求时,JVM会把该线程置为阻塞状态。当sleep状态超时,join等待线程终止或者超时,或IO处理完毕时,线程重新进入可运行状态。
  5. 死亡(DEAD): 线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

这里写图片描述

说明:

  1. 当一个线程执行了start方法后,不代表这个线程就会立即被执行,只代表这个线程处于可运行的状态,最终由OS的线程调度来决定那个可运行状态下的线程被执行。
  2. 一个线程一次被选中执行是有时间限制的,这个时间段叫做CPU的时间片,当时间片用完但线程还没有结束时,这个线程又会变成可运行状态,等待OS的再次调度;在运行的线程里执行Thread.yeild()方法同样可以使当前线程变成可运行状态。
  3. 在一个运行中的线程等待用户输入、调用Thread.sleep()、调用了其他线程的join()方法,则当前线程变为阻塞状态。
  4. 阻塞状态的线程等待用户输入完毕、sleep时间到、join的线程结束,则当前线程由阻塞状态变为可运行状态。
  5. 运行中的线程调用wait方法,此线程进入等待队列。
  6. 运行中的线程遇到synchronized同时没有拿到对象的锁标记、等待队列的线程wait时间到、等待队列的线程被notify方法唤醒、有其他线程调用notifyAll方法,则线程编程锁池状态。
  7. 锁池状态的线程获得对象锁标记,则线程变成可运行状态。
  8. 运行中的线程run方法执行完毕或main线程结束,则线程运行结束。

猜你喜欢

转载自blog.csdn.net/wxr15732623310/article/details/79915199