生命周期:一个事物从出生的那一刻到最后死亡的中间过程.
线程也是有生命周期的,也存在不同的状态的,状态之间的转换就形成了线程的生命周期.
参考 : 大家可以在jdk文档中搜索Thread类,然后查看内部类State查看线程的六个状态:
NEW
至今尚未启动的线程处于这种状态。RUNNABLE
正在 Java 虚拟机中执行的线程处于这种状态。BLOCKED
受阻塞并等待某个监视器锁的线程处于这种状态。WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。TIMED_WAITING
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。TERMINATED
已退出的线程处于这种状态
下面对这些状态详细的分析一下 : 在给定时间点上,一个线程只能处于一种状态;
- 新建状态(new) : 使用new创建一个线程对象,仅仅在堆中分配内存空间,在调用state方法之前.
新建状态下,线程压根就没有启动,仅仅只是存在一个线程对象而已.
Thread t = new Thread();//此时t就属于新建状态;
当新建状态下的线程调用了start()方法后,线程从新建状态进入可运行状态;
- 可运行状态(runnable) : 又分成两种状态, ready和running。分别表示就绪状态和运行状态。
就绪状态 : 线程对象在调用start()方法后,等待JVM调度(此时该线程并没有运行)。
运行状态 : 线程对象获取JVM调度,如果存在多个CPU,则允许多个线程并行运行。
- 阻塞状态(blocked) : 正在运行的线程,因为某些原因放弃CPU,暂时停止运行,就会进入阻塞状态。
此时JVM不会给线程分配CPU,知道线程重新进入就绪状态,才有机会转到运行状态;
注 : 阻塞状态只能先进入就绪状态,不能直接进入运行状态。
阻塞状态分为两种情况 :
1.当A线程处于运行过程时,试图获取同步锁时,却被B线程获取.此时JVM把当前A线程存到对象的锁池中,A线程进入阻塞状态.
2.当线程处于运行过程时,发出了IO请求时,此时进入阻塞状态.
- 等待状态(waiting) : (等待状态只能被其他线程唤醒):此时使用的无参数的wait方法,
当线程处于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中.
- 计时等待状态(timed waiting) : (使用了带参数的wait方法或者sleep方法)。
1):当线程处于运行过程时,调用了wait(long time)方法,此时JVM把当前线程存在对象等待池中。
2):当前线程执行了sleep(long time)方法.
- 终止状态(terminated) : 通常称为死亡状态,表示线程终止.
1):正常执行完run方法而退出(正常死亡).
2):遇到异常而退出(出现异常之后,程序就会中断)(意外死亡).