Java线程既可以创建,也可以销毁,所以线程是有生命周期的,而线程的生命周期就可以用线程的六种状态来描述。
从Thread类的源码中可以看出线程一共有6种状态:
这六种状态分别是:
New:初始状态,线程被创建,没有调用start()。
Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中”。
Blocked:阻塞,线程进入等待状态,线程因为某种原因,放弃了CPU的使用权。
阻塞的几种情况:
A. 等待阻塞:运行的线程执行了wait(),JVM会把当前线程放入等待队列。
B. 同步阻塞:运行的线程在获取对象的同步锁时,如果该同步锁被其他线程占用了,JVM会把当前线程放入锁池中。
C. 其他阻塞:运行的线程执行sleep(),join()或者发出IO请求时,JVM会把当前线程设置为阻塞状态,当sleep()执行完,join()线程终止,IO处理完毕线程再次恢复。
Waiting:等待状态。
timed_waiting:超时等待状态,超时以后自动返回。
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方法的灵活性更高。
通过命令行的方式查看线程状态
先介绍两个命令:
Jps:JDK 1.5提供的显示当前所有Java进程pid的命令,可以获取相应的进程pid。
Jstack:是Java虚拟机自带的一种堆栈跟踪工具,他可以打印出给定的进程pid信息和远程调试服务的Java堆栈信息。
具体操作步骤:
打开终端或命令行工具,输入jps命令,获取pid;
输入jstack pid,查看当前进程的信息。
PHP中文网,有大量免费的JAVA入门教程,欢迎大家学习!