一、线程有哪六种状态?
1、六种状态
- New
- 表示已创建还没启动的新线程。通俗的来说就是我们使用Thread thread = new Thread(),还没调用start方法的线程。
- Runnable
- 一旦调用start方法,线程便会进入runnable(可运行的)状态,即可以值线程运行的状态,也可以值线程准备好了可运行的状态。
- Blocked
- 当一个线程进入到被synchronized修饰的代码块的时候,并且该锁已经被其他的线程拿走了,也就是该monitor已经被其他线程拿走了,我们拿不到这个monitor的时候,线程的状态就是Blocked
- 这个Blocked仅仅是针对synchronized这个关键字才能进入blocked,因为和synchronized关键字起到相同作用的还有其他的lock,但是哪些情况下绝对不是blocked的状态。
- Waiting
- Object.wait()
- Thread.join()
- Locksupport.park()
- Timed waiting
- Thread.sleep(time)
- Object.wait(time)
- Thread.join(time)
- Locksupport.parkNanos(time)
- LockSupport.parkUntil(time)
- Terminated
- 线程自然的执行完
- 出现一个没有被捕获的异常,导致这个方法意外终止。
2、六种状态的其他说明
- Timed waiting和waiting的区别就是加了时间参数,除了可以等待唤醒的信号外,也可以等待时间到被唤醒。
- Timed waiting和waiting看起来和blocked这种有点相似,区别在于blocked等待另外的线程释放一个排它锁,而Timed waiting和waiting是等待被唤醒。
3、线程六种状态示例图
4、什么是阻塞状态
- 一般而言,把blocked(被阻塞)、waiting(等待)、timed_waiting(计时等待)都成为阻塞状态。
- 不仅仅是blocked
二、说明
本文为学习慕课网悟空老师的课程《线程八大核心+Java并发底层原理精讲》笔记,文章为原创,知识点为老师所讲,有兴趣可以购买悟空老师的课程学习,支持知识付费,笔记如果有误希望大家指正,谢谢。