查看Thread类的源码,可以看到其包含一个内部枚举State, 从而发现线程拥有六个状态:
(1)New : 新建;
线程刚刚被创建,但是并未被启动,即未调用start()方法。
(2)Runnable : 可运行;
可以在java虚拟机中运行的状态,但是它可能在运行自己的代码,也可能没有,这取决于操作系统处理器。
(3)Blocked : 被阻塞;
当一个线程试图获取一个内部的对象锁,而该对象锁被其他的线程持有,则该线程进入被阻塞状态。
(4)Waitting : 等待;
如果当前线程调用wait()方法,则当前线程进入Time waiting但是这个时候当前线程会释放所占有的JVM资源,进入这个状态过后是不能自动唤醒的,必须调用notify()或者notifyAll()方法,线程进入Waiting
(5)Timed_Waitting: 计时等待;
Object.wait、Thread.join、Lock.tryLock和Condition.await等方法有超时参数,还有Thread.sleep方法、LockSupport.parkNanos方法和LockSupport.parkUntil方法,这些方法会导致线程进入计时等待状态,如果超时或者出现通知,都会切换会可运行状态
(6)Terminated : 被终止;
因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。
简易状态转换图: