Java线程的生命周期(新手必看)
线程拥有自己的生命周期,一个线程从创建到销毁的过程就是线程的生命周期。
线程在整个生命周期中的不同时刻可能处于不同的状态,有些线程任务简单,涉及的状态就少。而有些线程任务复杂,拥有的状态也更多。那么线程到底有多少种状态?不同状态之间又是如何转换的呢?
Java 将线程分为 5 种状态:新建状态、就绪状态、等待状态、运行状态和死亡状态,如下图所示:

图 1 Java 线程的 5 种状态
1) 新建状态:如果一个线程被创建但未被启动则处于新建状态。在程序中使用 new MyThread() 来创建的线程实例在调用 start() 方法之前都处于此状态。
2) 就绪状态:创建的线程实例在调用 start() 方法后便进入就绪状态。处于此状态的线程并不意味着真正在运行,就绪的线程会被加入队列中等待 CPU 的执行时间。我们可以想象有一个线程池,start() 方法会把线程放进线程池中,然后 CPU 会按一定的规则去执行线程池里的线程。
3) 运行状态:当就绪线程获取到 CPU 执行时间时就进入了运行状态。
4) 等待状态:运行中的线程可能会因某种原因暂时放弃 CPU 的使用权,可能是因为执行了挂起、休眠或等待等操作。比如在执行 I/O 操作时由于外部设备的速度远低于处理器的速度,会导致线程暂时放弃 CPU 的使用权。
5) 死亡状态:线程执行完 run() 方法实现的任务,或因为异常导致停止执行并退出后,就进入了死亡状态,线程进入死亡状态后将无法再转换成其他状态。
一个线程从创建到死亡期间可能会经历若干状态,但在任意一个时间点上线程只能处于其中一种状态。
线程在整个生命周期中的不同时刻可能处于不同的状态,有些线程任务简单,涉及的状态就少。而有些线程任务复杂,拥有的状态也更多。那么线程到底有多少种状态?不同状态之间又是如何转换的呢?
Java 将线程分为 5 种状态:新建状态、就绪状态、等待状态、运行状态和死亡状态,如下图所示:

图 1 Java 线程的 5 种状态
1) 新建状态:如果一个线程被创建但未被启动则处于新建状态。在程序中使用 new MyThread() 来创建的线程实例在调用 start() 方法之前都处于此状态。
2) 就绪状态:创建的线程实例在调用 start() 方法后便进入就绪状态。处于此状态的线程并不意味着真正在运行,就绪的线程会被加入队列中等待 CPU 的执行时间。我们可以想象有一个线程池,start() 方法会把线程放进线程池中,然后 CPU 会按一定的规则去执行线程池里的线程。
3) 运行状态:当就绪线程获取到 CPU 执行时间时就进入了运行状态。
4) 等待状态:运行中的线程可能会因某种原因暂时放弃 CPU 的使用权,可能是因为执行了挂起、休眠或等待等操作。比如在执行 I/O 操作时由于外部设备的速度远低于处理器的速度,会导致线程暂时放弃 CPU 的使用权。
5) 死亡状态:线程执行完 run() 方法实现的任务,或因为异常导致停止执行并退出后,就进入了死亡状态,线程进入死亡状态后将无法再转换成其他状态。
一个线程从创建到死亡期间可能会经历若干状态,但在任意一个时间点上线程只能处于其中一种状态。