线程的生命周期
线程创建并启动后,不是一启动就进入执行状态,也不会一直处于执行状态。
线程启动后不可能一直霸占CPU,所以CPU会在多线程之间切换,于是线程状态也会多次在运行、阻塞之间切换
在线程的生命周期中,线程共有5种状态,在任意时刻,线程的状态只能是其中的一种
状态 | 说明 |
---|---|
New | 初始状态 —>使用new关键字,创建一个线程,但是还没有调用start方法,仅仅由JVM分配内存,并初始化成员变量 |
Runnable | 就緒状态 —> 调用start()后处于就绪状态,JVM为其创建方法调用栈和程序计数器,但线程并没有开始运行,仅表示可以运行。何时开始,取决于JVM里的线程调度器的调度 |
Running | 运行状态 —>处于就绪状态的线程,获得了CPU,开始执行run()方法,则处于运行状态 |
Blocked | 阻塞状态 —> 表示线程阻塞于锁。线程之间需要切换,时间段用完后,系统会剥夺线程占用的资源,让其他线程执行,选择哪个线程,系统会考虑线程的优先级。调用sleep(),调用阻塞式IO方法,等待同步锁,等待通知wait(),suspend(),join(),这些将使得线程进入阻塞状态 |
Waiting | 等待状态 —> 进入该状态后需要其他线程做出通知动作,也可以算是阻塞状态。需要notify()唤醒线程,使之进入就绪状态 |
Time_Waiting | 超时等状态状态 —> 该状态与WAITING不同,它是可以在指定时间内自行返回的。相当于在等待状态基础上,增加了时间的限制,超过了设定的时间限制就会返回到运行状态 |
Dead | 死亡状态 —> 线程执行完毕。run()或call()执行完成,线程抛出未捕获的Exception或Error,调用该线程的stop(),都会结束线程。 |
为了测试线程是否已经死亡,可以调用线程对象的isAlive()方法,若处于就绪、运行、阻塞三种状态,方法返回true;若线程处于新建、死亡状态,方法返回false。
不能对已经死亡的线程调用start()方法,重新启动,否则抛IllegalThreadStateException异常