线程间各种转态的切换,以及等待队列与同步队列的区别

面试的时候曾被问到过线程间状态的转换问题,自己回答的不是太好,故查阅了一些资料来巩固这一片空白,资料参考自微信公众号 java团长。

首先线程总共有六种状态,分别是初始,运行,阻塞,等待,超时等待,终止转态。

第一种:初始(NEW)指新建一个线程对象如Thread thread = new Thread(()->{});还没有调用其start() 方法。

第二种:运行状态(RUNNABLE)java线程中将就绪状态(ready,满足条件但未获取时间片)和运行中(running)两种状态笼统的称为“运行”。

    线程对象在创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获取cpu时间片后将会变为运行中状态(running)。

第三种:阻塞状态(BLOCKED):表示线程阻塞于锁

第四种:等待状态(WAITING):进入该状态的线程需要等待其他线程做一些特定的动作(通知或中断)。

第五种:超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。

第六种:终止状态(TERMINATED):表示该线程已经被执行完毕。

下面请看一种状态转化图:

 

 

注意上面一些逻辑,只有进入等待进入synchronized方法或者synchronized同步块失败后才会进入阻塞状态,使用wait后线程进入等待状态,处于等待状态的线程不会被分配cpu执行时间,他们需要等待被显示的唤醒,否则就会处于无限等待的状态。

 对于超时等待,处于该种状态的线程也不会被分配cpu执行时间,不过无需无限等待被其他线程唤醒,在到达一定时间后他们会自动唤醒

 

例外在使用锁的时候需要注意到同步队列和等待队列,一个线程调用对象的 object.wait()方法后会进入等待队列,然后同步队里竞争锁,调用notifyaAll()方法会唤醒所有等待队列中的线程,进入同步队列里竞争锁,调用notify会随机唤醒一个等待队列中的线程进入同步队列,这个是随机的,总之需要区分等待队列与同步队列。只有同步队列里的线程有资格获得锁。

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值