一、前言
我在当面试官的时候,特别喜欢让面试者聊一聊Java线程的生命周期,因为这个问题特别能考察面试者对线程的理解程度。但是在这过程中,能够比较完整的回答出这个问题的面试者寥寥无几,今天通过一篇文章来和大家聊聊这个问题。
二、Java线程的6种状态
Java线程的状态定义在Thread类的State枚举中,如下图所示:
其中:
NEW : 线程刚创建,还未调用start方法
RUNNABLE : 线程正在运行或正在等待分配资源。
BLOCKED : 线程等待获取监视器锁用于进入或者重新进入同步代码块或方法。
WAITING : 线程一直等待,直到其他线程执行唤醒操作。
TIMED_WAITING: 线程在特定时间内一直等待,直到超时或者其他线程执行唤醒操作
TERMINATED : 线程已经执行完成。
我们从上面可以看到Java线程的6种状态,那么这6种状态之间是如何切换的呢?
三、Java线程状态间的切换
Java线程状态间切换图如下:
- 当通过Thread类的构造函数生成Thread实例时,此时线程处于NEW状态;
- 当调用start()方法时,此时线程处于RUNNABLE状态,在RUNNABLE状态中又有准备就绪和运行中两种状态。
- 当处于RUNNABLE状态的线程调用同步方法或同步代码块时,若此时其他线程已经获取了锁,那么该线程转换为BLOCKED状态。当其他线程释放锁,该线程获取到锁时,此时线程从BLOCKED状态转换为RUNNABLE状态。
- 当处于RUNNABLE状态的线程调用join()、wait()或LockSupport.park()方法时,线程转换为WAITING状态,当有其他线程执行notify()、notifyAll()或LockSupport.unpark(Thread)方法时,线程又从WAITING转换转换为RUNNABLE状态。
- 当处于RUNNABLE状态的线程调用join(long)、wait(long)、LockSupport.parkNanos(long)、LockSupport.parkUntil(long)和Thread.sleep(long)方法时,线程转换为TIMED_WAITING状态,当有其他线程执行notify()、notifyAll()、LockSupport.unpark(Thread)或等待时间已经超过超时时间,线程又从TIMED_WATING状态转换为RUANNBLE状态。
- 当线程run方法的逻辑都执行完成后,线程转换到TERMINATED状态。
四、总结
好了,今天我们的介绍就到这了,希望大家通过这篇文章能够把线程的生命周期完全掌握,轻松通过面试,拿下高薪Offer。
欢迎关注小强1024实验室,和小强一起用技术改变世界