线程对象的状态

1、在java中使用枚举类型Thread.State可以表示出一个线程对象当前的状态,调用线程对象的getState()方法可以获得线程的当前状态

java.lang.Thread.State枚举类型
	public class Thread implements Runnable{
		public enum State {
			NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
		}
	}

2、各个状态的含义
NEW(新建尚未运行/启动)
A thread that has not yet started is in this state.

一般是还没调用start方法,或者刚刚调用了start方法,start方法不一定"立即"改变线程状态,中间可能需要一些步骤才完成一个线程的启动。

RUNNABLE(可运行状态: 包括正在运行或准备运行)
A thread executing in the Java virtual machine is in this state.

start方法调用结束,线程由NEW变成RUNNABLE.
线程存活着,并尝试抢占CPU资源,或者已经抢占到CPU资源正在运行的状态都显示为RUNNABLE

BLOCKED(等待获取锁时进入的状态)
A thread that is blocked waiting for a monitor lock is in this state.

线程A和线程B都要执行方法test,而且方法test被加了锁,线程A先拿到了锁去执行test方法,线程B这时候需要等待线程A把锁释放。这时候线程B就是处理BLOCKED

WAITING(通过wait方法进入"无限期"的等待)
A thread that is waiting indefinitely for another thread to perform a particular action is in this state.

线程A和线程B都要执行方法test,而且方法test被加了锁,线程A先拿到了锁去执行test方法,线程B这时候需要等待线程A把锁释放(线程B处于BLOCKED状态),
如果这时候线程A调用了wait方法,那么线程A就会马上交出CPU的使用权以及刚才拿到的锁,从而进入到WAITING状态,而线程B发现锁已经被释放了,线程B就从BLOCKED状态进入到了RUNNABLE,
如果线程B拿到了锁之后在运行期间,调用了notify或者notifyAll方法,这时候线程A就会从WAITING状态进入到BLOCKED状态,从而等待锁的是释放.

TIMED_WAITING(通过sleep或wait等方法进入的"有限期"等待的状态)
A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.

线程对象的sleep或wait等方法都可以传一个时间参数,表示就算没有其他线程调用特定方法来改变自己状态的时候,也可以通过这个时间参数让自己自动改变状态(因为时间到了)。

TERMINATED(线程终止状态)
A thread that has exited is in this state.

线程结束了,就处于这种状态,也就是run方法运行结束了。

3、线程状态图
线程状态分为:
初始化状态:NEW ,新建的线程还没有运行或启动
就绪状态: NEW到RUNNABLE之前,就绪状态的线程必须拿到CPU的使用权才能进进入运行状态
运行状态:RUNNABLE,可运行状态: 包括正在运行或拿到CPU使用权准备运行
死亡状态: TERMINATED, 线程终止状态
阻塞状态(阻塞在等待池、阻塞在锁池、其他情况阻塞): BLOCKED(等待获取锁时进入的状态) WAITING(通过wait方法进入"无限期"的等待)TIMED_WAITING(通过sleep或wait等方法进入的"有限期"等待的状态

Java获取当前环境可用线程数 java获取当前线程对象_枚举类型