线程六大状态
线程的状态一共分为六种:
- New
- 已创建但是还没有启动的线程
- 比如new Thread后的线程,但是还没执行start方法
- Runnable(可运行的,而不只是正在运行的)
- new后的线程,调用了start方法,此时的线程就是Runnable状态
- 调用了start方法,不代表线程启动了,有可能还在队列中等待资源分配,还没被处理器执行。
- 拿到CPU运行后,同样也叫做Runnable状态
- 运行时的线程,CPU资源被抢走了,此时线程还是处于Runnable状态,因为只要得到CPU,它就可以继续运行
- Runnable既可以代表可运行的,也可以代表运行中的
- Blocked
- 当一个线程进入到被synchronized修饰的代码块时,而且该锁被其他线程拿走了,那么这个线程的状态就是Blocked。
- 一定是进入了被Synchronized保护的代码
- Waiting
- Object.wait(),Thread.join(),LockSupport.park()方法会让线程从Runnable进入Waiting状态。 注意这里的方法不带参数,等待没有时间限制
- 唤醒信号: Object.notify(),Object.notifyAll(),LockSupport.unpark()会让线程从Waiting唤醒,回到Runnable状态
- Timed Waiting
- Thread.sleep(time),Object.wait(time),Thread.join(time),LockSupport.parkNanos(time),LockSupport.parkUnit(time),指定一个时间,让线程进入Timed Waiting状态,等待时间超出这个指定时间后,线程会被系统自动唤醒。 等待时间内,也可以被唤醒信号唤醒
- 唤醒信号:Object.notify(),Object.notifyAll(),LockSupport.unpark()
- Terminated
- 线程执行完成(run方法正常执行完成后退出了)
- 出现了一个未捕获的异常
线程状态转换图
从图中可以看出线程的一生从New开始,到Terminated结束,其中New->Runnable->Terminated是单向的,不能回到由现状态回到上一个状态。
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/12/concurrent/2020-03-12-threadStatus/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!