线程各状态

五大状态、两大队列

线程中的五中状态,对应cpu的状态
在这里插入图片描述
sleep:睡
join:主程序中可以将子线程join 回来,然后都在主程序中运行 shutDown
yield:让出cpu一次
wait:先拿到锁,在让出锁,并等待唤醒
await:先拿到锁,在让出锁,并等待唤醒
notify:唤醒
sainal:唤醒

wait 前提先拿到锁 等待并释放锁
notify notifyAll 前提先拿到锁 再唤醒其他的线程,自己同时也可以不释放这个锁,当notify这个所在的方法执行完之后才会去唤醒。

notify、notifyAll唤醒顺序,
具体看底层实现,jvm层给的说明是随机,但hotsport底层存储是链表形式,他的唤醒是有序的,notify正序,notifyAll倒叙。

sleep与wait区别:
只有runnable到running时才会占用cpu时间片,其他都会出让cpu时间片
sleep 释放cpu资源,不释放锁资源。如果线程进入sleep的话,释放cpu资源,如果外层包有synchronize,那么此锁并没有释放掉。
wait 释放cpu资源,也释放锁资源。一般用于锁机制中 肯定是要释放掉锁的,因为notify并不会立即调起此线程,因此cpu是不会为其分配时间片的,也就是说wait 线程进入等待池,cpu不分时间片给它,锁释放掉。
wait用于锁机制,sleep不是,这就是为啥sleep不释放锁,wait释放锁的原因,sleep是线程的方法,跟锁没半毛钱关系,wait,notify,notifyall 都是Object对象的方法,是一起使用的,用于锁机制。

为什么sleep0
https://mp.weixin.qq.com/s/5YGbVNWvUPcYsOgDyImHdA
操作系统中,CPU竞争有很多种策略。Unix系统使用的是时间片算法,而Windows则属于抢占式的。
在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程 序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
所谓抢占式操作系统,就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢 占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。
因此在抢占式操作系统中,Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.Sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值