你了解线程的状态转换吗
Posted 写Bug的渣渣高
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你了解线程的状态转换吗相关的知识,希望对你有一定的参考价值。
本文概述:
讲述线程的六种状态.
你可能已经了解了六种状态, 但是你知道 sleep 被唤醒之后, wait ()被 notify 之后进入了什么状态吗?
本文只是开胃小菜, 你看看下一篇文章对你有没有帮助.
一共有六种状态:
- New 新建状态
- Runnable 运行状态
- Blocked 阻塞状态
- Waiting 等待状态
- TimedWaiting 计时等待
- Termiated 被终止状态
我们需要了解, 一个线程任意时刻, 只会处于一种状态.
New 创建状态
表示线程被创建, 但是没有被启动的状态. 在代码层面代表的就是 new Thread ()到调用 start ()方法之前.
当调用了 start () 方法之后, 进入 Runnable 状态
Runnable 状态
Runnable 对应的是操作系统中的两种状态, 分别是 Running 和 Ready .也就是说,Runnable 代表的不是 Running 正在运行, 而是具备运行的能力, 准备好了线程运行所需要的资源, 只要被调度就可以开始执行了
阻塞状态
注: 经常会把 Blocked,Waiting,TimeWaiting 统称为阻塞状态, 这一点要注意了.
Blocked
这里指的是进入 synchronized 保护的代码, 没有抢到 monitor 锁的情况下.
这里要疯狂注意了, 如果你对 synchronized 的三种锁有了解, 你需要注意一下这里指的是重量锁
对于阻塞状态, 比如说另一个线程释放锁了,在拿到锁的前提下, 会转为 Runnable 状态.
如果拿不到锁, 永久也不会主动恢复
Waiting 状态和 Timewaiting 状态
Waiting:
比如说 Object. wait ()方法
比如说 Thread. join ()方法
Timewaiting:
sleep ()
wait (time)
join (time)
注意啦注意啦, join 方法, 只有 join 运行的线程结束, 或者是被中断了, 才会进入 Runnable 状态.
下面的很重要, 如果 wait (方法)都是通过 notify 和 notifyAll 来唤醒的吧, 对于这两个方法是必须获取锁, 才能调用的 (仔细思考一下, 这都是 Object 中的对象), 而唤醒之后, 被唤醒的线程会进入 Blocked 状态, 他只是拥有了去抢夺锁的权力.
以上是关于你了解线程的状态转换吗的主要内容,如果未能解决你的问题,请参考以下文章