线程的状态总结

1.当线程继承Thread或者实现了Runnable创建了线程对象后,当new线程对象过后线程就进入了初始的状态。

2.当线程对象调用了start()方法的时候,线程启动进入可运行的状态。

3.线程进入可运行状态后,如果逻辑完成那么线程将会终结,如果没有执行完毕中间JVM分配时间片用完,将进入可运行状态,一旦线程被JVM选中则立即执行。

4.运行状态的情况比较复杂

第一:线程如果执行run() main()方法结束后,完成逻辑,线程就进入Terminated

第二:当线程调用sleep()或者join()方法就会进入Blocked状态,但是要注意的是阻塞的线程是不释放当前所占有的系统资源,当sleep()结束或者join()等待其他线程来到,当前线程则进入Runnable状态等待JVM分配资源。

第三:当线程进入Runnable状态,但是还没有开始运行的时候,此时发现需要的资源处于同步状态synchronized,这个时候线程将会进入Time waiting,JVM会使用队列对这些线程进行控制,既先进行Time waiting的线程会先得到JVM资源进行执行进入Waiting

第四:如果处于Runnable的线程调用yield()让出JVM资源,那么就会进入New状态和其他New状态线程进行竞争重新进入Runnable

第五:如果当前线程调用wait()方法,则当前线程进入Time waiting但是这个时候当前线程会释放所占有的JVM资源,进入这个状态过后是不能自动唤醒的,必须调用notify()或者notifyAll()方法,线程进入Waiting。

1.首先sleep()是Thread类的方法静态方法,需要通过Thread类调用,Thread.sleep()。而wait()和notify()是Object类中的实例方法,因为java所有类都继承于object类,所有类中都可以使用。

2.wait(),和notify()必须用在synchronized代码块中调用,否则会抛出异常(因为wait()需要释放对象锁,如果不在synchronized代码块中不能保证拥有对象锁)。

3.当在synchronized代码块中使用sleep(),线程会被挂起,但不会释放对象锁,所以如果有其他线程等待执行该synchronized代码块,一直会被阻塞,等待该线程被唤醒释放对象锁。

4.当在synchronized代码块中使用wait(),线程会被挂起,需要notify()唤醒,但该线程会释放对象锁,所以其他线程可以执行该synchronized代码块



作者:张天偿
链接:https://www.jianshu.com/p/1f1e9bdb9831
來源:简书
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值