一看就懂的线程状态
线程6大状态(我的理解)
- NEW(新建状态):新建一个线程
- RUNNABLE(可运行态):得到了锁,得到了时间片,正在运行。
- BLOCKED(阻塞状态):未得到锁,在此等候得到锁。
- WAITING(无限等待状态):wait()没有被主动唤醒,t.join() 线程t没有运行完毕。
- TIMED_WAITING(有限等待状态):wait(时间)、sleep(时间)、t.join(时间),当时间还没结束。
- TERMINATED(终止状态):线程结束
状态图解析
- 图中左下角的6大状态是API文档中介绍的,比较官方。
- 我画得图中多了一个不存在Running状态,是为了好理解
- wait()方法执行时,会释放锁资源,致使其被唤醒后或时间到期后,直接进入阻塞状态,去请求锁资源。
- sleep()和join()执行时,不会释放锁资源,因此方法结束后,直接进入runnable状态。
状态图简单版
状态图简单版摘自https://my.oschina.net/ericquan8/blog/384655
Join方法简介
- 线程合并:将两个交替执行的线程合并为顺序执行的线程,即让异步执行的线程变成同步执行的线程
- t.join():方法阻塞调用此方法的线程,直到线程t完成,此线程再继续
- t.join(1000):等待 t 线程,等待时间是1000毫秒
wait、sleep和yield方法的区别
-
wait:程序员
- 定义在Object类中,是一个实例方法
- 只能在同步(synchronize)环境中被调用,可被notify和notyfyAll线程唤醒
- 等待时会释放锁,唤醒后进入阻塞状态
- 被用于线程间通讯
- wait、notify、notifyAll无需捕获异常
-
sleep:异步
- 定义在Thread类中,是一个静态方法
- 等待时持有锁,可设置睡眠时间,唤醒后进入就绪状态
- 被用于短期暂停当前线程
- 必须捕获异常
-
yield(礼让线程):.net
- 定义在Thread类中
- 调用时让出cpu执行权,让有一样优先级(大于等于)的正在等待的线程有机会执行。
- 谁能得到CPU资源取决于调度器,yield方法是不可靠的,它只能尽力而为
PS:线程
- 状态图详细版,来自本人参考许多资料后,花了几个小时本身手工画的,以为有帮助的朋友们请点个赞,程序员画图画的想哭!(想追求完美)
- 文章来自各类资源的整理,若有侵权请告知删除。
- 转载本文请注明出处
欢迎关注本站公众号,获取更多信息