一看就懂的线程状态

3,117 阅读2分钟

线程6大状态(个人理解)

  1. NEW(新建状态):新建一个线程
  2. RUNNABLE(可运行态):获得了锁,获得了时间片,正在运行。
  3. BLOCKED(阻塞状态):未获得锁,在此等候获得锁。
  4. WAITING(无限等待状态):wait()没有被主动唤醒,t.join() 线程t没有运行完毕。
  5. TIMED_WAITING(有限等待状态):wait(时间)、sleep(时间)、t.join(时间),当时间还没结束。
  6. TERMINATED(终止状态):线程结束

状态图解析

  1. 图中左下角的6大状态是API文档中介绍的,比较官方。
  2. 我画得图中多了一个不存在Running状态,是为了好理解
  3. wait()方法执行时,会释放锁资源,导致其被唤醒后或时间到期后,直接进入阻塞状态,去请求锁资源。
  4. sleep()和join()执行时,不会释放锁资源,所以方法结束后,直接进入runnable状态。

状态图简单版

状态图简单版摘自https://my.oschina.net/ericquan8/blog/384655

Join方法简介

  1. 线程合并:将两个交替执行的线程合并为顺序执行的线程,即让异步执行的线程变成同步执行的线程
  2. t.join():方法阻塞调用此方法的线程,直到线程t完成,此线程再继续
  3. t.join(1000):等待 t 线程,等待时间是1000毫秒

wait、sleep和yield方法的区别

  • wait:

    1. 定义在Object类中,是一个实例方法
    2. 只能在同步(synchronize)环境中被调用,可被notify和notyfyAll线程唤醒
    3. 等待时会释放锁,唤醒后进入阻塞状态
    4. 被用于线程间通信
    5. wait、notify、notifyAll无需捕获异常
  • sleep:

    1. 定义在Thread类中,是一个静态方法
    2. 等待时持有锁,可设置睡眠时间,唤醒后进入就绪状态
    3. 被用于短时间暂停当前线程
    4. 必须捕获异常
  • yield(礼让线程):

    1. 定义在Thread类
    2. 调用时让出cpu执行权,让有同样优先级(大于等于)的正在等待的线程有机会执行。
    3. 谁能获得CPU资源取决于调度器,yield方法是不可靠的,它只能尽力而为

PS:

  1. 状态图详细版,来自本人参考许多资料后,花了几个小时自己手工画的,觉得有帮助的朋友们请点个赞,程序员画图画的想哭!(想追求完美)
  2. 文章来自各种资源的整理,如有侵权请告知删除。
  3. 转载本文请注明出处