美文网首页
Java 线程生命周期

Java 线程生命周期

作者: Tinyspot | 来源:发表于2022-09-06 12:33 被阅读0次

1. 线程状态

  • 线程状态的转换会导致上下文的切换

1.1 操作系统层面(5种)

  • 初始状态
    • 只是创建了线程对象,还未与操作系统线程关联
  • 可运行状态(就绪状态)
    • 线程已创建(与操作系统线程关联),可以由 CPU 调度执行
  • 运行状态
    • 获取了 CPU 时间片,运行中的状态
    • 当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致上下文切换
  • 阻塞状态
    • 调用阻塞 API,进入阻塞状态
    • 如调用 BIO 读写文件,(这时线程实际不会用到 CPU)线程上下文切换,进入阻塞状态,等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】
    • 与【可运行状态】的区别是,在阻塞状态的线程,只要它们一直不唤醒,调度器就一直不会考虑调度他们
  • 终止状态
    • 线程已执行完毕,生命周期已经结束

1.2 Java API 层面(6种)

  • Thread.State 枚举:NEW, RUUNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED
  • BLOCKED 是正在等待锁的线程
  • WAITING 是已经获得了锁,但又放弃了锁
thread-state

2. java.lang.Thread.State

  • RUNNABLE 涵盖了操作系统层面的【可运行状态】、【运行状态】、【阻塞状态 (BIO导致的阻塞)】
public enum State {
  NEW,

  RUNNABLE,
  /**
  * Thread state for a thread blocked waiting for a monitor lock. A thread in the blocked state is waiting 
  * for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method 
  * after calling Object.wait.
  */
  BLOCKED,
  /**
    * Object.wait with no timeout
    * Thread.join with no timeout
    * LockSupport.park (显示调用,还有隐式调用,如 BlockingQueue的 take 和 put)
    */
  WAITING,
  /**
  * Thread.sleep
  * Object.wait with timeout
  * Thread.join with timeout
  * LockSupport.parkNanos
  * LockSupport.parkUntil
  */
  TIMED_WAITING,

  TERMINATED;
}

相关文章

网友评论

      本文标题:Java 线程生命周期

      本文链接:https://www.haomeiwen.com/subject/yvhjnrtx.html