线程的状态

五种状态

这是从操作系统层面来描述的

初始状态: 仅仅是在语言层面创建了线程对象,还没有与操作系统线程相关联

可运行状态:指该线程已经被创建(与操作系统线程关联),可以由cpu调度执行

运行状态:指获取了cpu时间片运行中的状态

当cpu时间片 用完,会从运行状态转换至可运行状态,会导致线程的上下文切换

阻塞状态

  • 如果调用了阻塞API,如BIO读写文件,这个时候线程实际不会用到cpu,会导致线程上下文切换,进入阻塞状态;
  • 等BIO操作完毕,会由操作系统唤醒阻塞的线程,转换成可运行状态;
  • 与可运行状态的区别是,对阻塞状态的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们。终止状态:

终止状态:表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态

六种状态

这是从Java API层面来描述的

NEW:线程刚被创建,但是还没有调用start()方法

RUNNABLE:当调用了start()方法之后,注意,Java API层面的RUNNABLE状态涵盖了操作系统层面的可运行状态,运行状态和阻塞状态

TIMEINATED:线程代码运行结束

假设有线程Thread t

情况1 NEW-->RUNNABLE

  • 当调用t.start()方法时,由NEW-->RUNNABLE

情况2 RUNNBALE <-->WAITING

线程用synchronized(obj)获取了对象锁之后

  • 调用obj.wait()方法时,t线程从RUNNBALE -->WAITING
  • 调用obj.notify()、obj.notifyAll()、t.interrupt()时
  1. 竞争成功,t线程从WAITING-->RUNNABLE
  2. 竞争失败,t线程从WAITING-->BLOCKED

情况3 RUNNABLE<-->WAITING

  • 当前线程调用t.join()方法时,当前线程从RUNNABLE-->WAITING

        注意是当前线程在t线程对象的监视器上等待

  • t线程运行结束,或者调用了当前线程的interrupt()时,当前线程从WAITING-->RUNNABLE

情况4 RUNNABLE<-->WAITING

  • 当前线程调用LockSupport.park()方法会让当前线程从RUNNABLE-->WAITING
  • 调用LockSupport.unpark()或者调用了线程的interrupt(),会让目标线程从WAITING-->RUNNABLE

情况5 RUNNABLE<-->TIMED_WAITING

t线程使用synchronized(obj)获取了对象锁后

  • 调用obj.wait(long n)方法时,t线程从RUNNABLE-->TIMED_WAITING
  • t线程等待时间超过了n毫秒,或者调用obj.notify()、obj.notifyAll()、t.interrupt()时
  1. 竞争成功,t线程从TIMED_WAITING-->RUNNABLE
  2. 竞争失败,t线程从TIMED_WAITING-->BLOCKED

情况6 RUNNABLE<-->TIMED_WAITING

  • 当前线程调用t.join(long n)方法时,当前线程从RUNNABLE-->TIMED_WAITING
  • 当前线程等待时间超过了n毫秒,或者t线程运行结束,或者调用了当前线程的interrupt()时,当前线程从TIMED_WAITING-->RUNNABLE

情况7 RUNNABLE<-->TIMED_WAITING

  • 当前线程调用Thread.sleep(long n),当前线程从RUNNABLE-->TIMED_WAITING
  • 当前线程等待时间超过了n毫秒,当前线程从TIMED_WAITING-->RUNNABLE

情况8 RUNNABLE<-->TIMED_WAITING

  • 当前线程调用LockSupport.parkNanos(long nanos)或者LockSupport.parkUntil(long millis)时,当前线程从RUNNABLE-->TIMED_WAITIG
  • 调用LockSupport.unpark(目标线程)或者调用了线程的interrupt(),或者等待超时,会让目标线程从TIMED_WAITING-->RUNNABLE

情况9 RUNNABLE<-->BLOCKED

  • t线程用synchronized(obj)获得了对象锁时如果竞争失败,从RUNNABLE-->BLOCKED
  • 持obj锁线程的同步代码块执行完毕,会唤醒该对象上所有BLOCKED的线程重新竞争,如果t线程竞争成功,从BLOCKED-->RUNNABLE,其它失败的线程仍然BLOCKED

情况10 RUNNABLE-->TERMINATED

当前线程所有代码运行完毕,进入TERMINATED

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值