携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
今天,我们来聊聊线程的状态,线程的状态在实际的排查问题中,会给我们带来一些信息,所以了解线程的状态也是必要的。
操作系统的线程状态
我们知道java是没有线程概念的,都是操作系统创建和调度线程,hotspot虚拟机内部是通过一个OS线程将java线程和操作系统创建的线程做关联,所以我们可以通过学习操作系统线程的状态来了解java线程状态。
操作系统线程主要有以下三个状态:
- 就绪状态(ready):当前线程已经准备好了,等待cpu的分配之后可进入running状态。
- 执行状态(running):当前线程正在使用CPU。
- 等待状态(waiting): 当前线程资源等待中
java线程的状态
NEW
这段英文说的是new状态是线程执行start方法之前,说白了就是你new一个线程出来就是new状态,这个状态操作系统没有。
RUNNABLE
这是说可运行的线程在java虚拟机执行,但是需要等待一些资源比如操作系统的调度,这个可以类似于操作系统线程的ready状态和running状态。
BLOCKED
这里说的是线程进入阻塞状态,等待一个线程锁,为了进入同步方法或者代码块,或者在唤醒之后重新进入同步方法或者代码块。
WAITING
调用这三个方法线程进入等待状态,一个线程调用方法进入等待状态,要等待另一个线程唤醒,唤醒之后不会立即执行,需要重新枪锁,
TIMED_WAITING
有时间的等待
TERMINATED
线程结束状态。
线程的状态转换
- NEW->RUNNABLE : 线程调用start方法。
- RUNNABLE->running: 回调run方法。
- RUNNABLE<-running: 时间片用完或者线程调用yleld()。
- RUNNABLE->BLOCKED: 线程睡眠或者线程执行join方法。
- RUNNABLE<-BLOCKED: 线程睡眠时间到重新等待cpu分配。
- RUNNABLE->TERMINATED: 线程任务执行结束。
- BLOCKED->TERMINATED: 线程调用中断。