java线程的几种状态是什么

内容摘要
Java线程既可以创建,也可以销毁,所以线程是有生命周期的,而线程的生命周期就可以用线程的六种状态来描述。从Thread类的源码中可以看出线程一共有6种状态:这六种状态分别是:1. Ne
文章正文

Java线程既可以创建,也可以销毁,所以线程是有生命周期的,而线程的生命周期就可以用线程的六种状态来描述。

从Thread类的源码中可以看出线程一共有6种状态:

32f558b7c5a72051dd08b97291af55c.png

这六种状态分别是:

1. New:初始状态,线程被创建,没有调用start()。

2. Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中”。

3. Blocked:阻塞,线程进入等待状态,线程因为某种原因,放弃了CPU的使用权。

阻塞的几种情况:

A. 等待阻塞:运行的线程执行了wait(),JVM会把当前线程放入等待队列。

B. 同步阻塞:运行的线程在获取对象的同步锁时,如果该同步锁被其他线程占用了,JVM会把当前线程放入锁池中。

C. 其他阻塞:运行的线程执行sleep(),join()或者发出IO请求时,JVM会把当前线程设置为阻塞状态,当sleep()执行完,join()线程终止,IO处理完毕线程再次恢复。

4. Waiting:等待状态。

5. timed_waiting:超时等待状态,超时以后自动返回。

6. terminated:终止状态,当前线程执行完毕。

线程的六种状态之间的转换:

当实例化一个线程之后,首先进入初始状态,即New状态,此时线程在启动的时候并不是立刻就运行,而是要等到操作系统调度之后才运行,然后调用start()进入运行状态,即runnable,其中运行状态中包括运行(running)和就绪(ready)两种状态,这两种状态在操作系统的调度下可以互相转换,如果运行中的线程时间片被CPU抢占的话就会变成就绪状态;运行中的线程通过调用synchronized方法或synchronized块进入阻塞状态,即blocked,当线程获取到锁之后进入运行状态;如果线程在执行过程中调用了sleep(),wait().join(),Locksupported.parkUtil()等方法时,会进入等待状态(waiting)或超时等待状态,即timed_waiting,再次调用notify(),notifyAll(),Locksupported.unpark()等方法时,又会重新进入运行时状态,当线程执行完成时,就进入了终止状态,即terminated状态。

注:Locksupported是JDK 1.6提供的一个工具类,在java.util.concurrent包中,它所提供的park,unpark方法比wait,notify方法的灵活性更高。

通过命令行的方式查看线程状态

先介绍两个命令:

1. Jps:JDK 1.5提供的显示当前所有Java进程pid的命令,可以获取相应的进程pid。

2. Jstack:是Java虚拟机自带的一种堆栈跟踪工具,他可以打印出给定的进程pid信息和远程调试服务的Java堆栈信息。

具体操作步骤:

打开终端或命令行工具,输入jps命令,获取pid;

输入jstack pid,查看当前进程的信息。

1577429073(1).jpg

代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!