线程的生命周期
线程的生命周期包含新建状态、就绪状态、运行状态、阻塞状态和销毁状态等5个状态。
1、新建状态
我们使用new()方法,让它有自己的内存空间,这样new出来的就是线程的新建状态。
2、就绪状态
从上面的例子中可以看出,当我们调用start()方法时,就进入了就绪状态。注意这个时候线程不会立刻执行,而是等待CPU给他分配资源,当获得了CPU资源就开始执行,这个是面试官经常问的点。
3、运行状态
当线程获得CPU的资源时就进入了运行状态,这里我来重点说明一下运行状态的线程,面试官经常在这里做文章。
因为处于运行状态的线程是非常复杂的,它有可能会变成就绪状态、阻塞状态或者死亡状态。
当执行run()方法时,如果线程在运行过程中失去了CPU资源的时候(如调用yield()方法),该线程就会暂停运行,因为线程已经从运行状态变成了就绪状态。
那么通过哪些方式能让线程从运行状态变成就绪状态呢?
当正处在运行中的线程调用sleep方法时,会主动放弃占用的系统资源
当正处在运行中的线程调用一个阻塞式IO方法时,如果一直在等待该方法返回值的时候,那么就会造成线程被阻塞
调用yield()方法会暂停当前正在运行的线程
线程正在等待通知(notify)
调用了线程的suspend方法将该线程挂起
当然除了线程在运行状态变成就绪状态外,还能直接让运行状态的线程变成销毁状态,比如线程出现了异常或者调用了stop()、desyory()等方法。
4、阻塞状态
如果执行了sleep()方法,这时就会让线程进入阻塞状态,当然造成这种情况的不只是只有调用sleep方法,比如当等待I/O设备的时候也会造成线程进入阻塞状态。
5、销毁状态
当线程运行结束的时候,或者被强制终止的时候,线程就进入了销毁状态。当然还有我们上面提到的运行过程中发生异常的情况、JVM异常结束、调用了stop()、desyory()等方法都会使线程进入销毁的状态。注意处于销毁状态的线程是不能复活的,如果强制调用start()方法,则会抛出java.lang.IllegalThreadStateException异常。