一、前言

我在当面试官的时候,特别喜欢让面试者聊一聊Java线程的生命周期,因为这个问题特别能考察面试者对线程的理解程度。但是在这过程中,能够比较完整的回答出这个问题的面试者寥寥无几,今天通过一篇文章来和大家聊聊这个问题。

二、Java线程的6种状态

Java线程的状态定义在Thread类的State枚举中,如下图所示:

一文搞懂Java的线程生命周期

其中:

NEW : 线程刚创建,还未调用start方法

RUNNABLE : 线程正在运行或正在等待分配资源。

BLOCKED : 线程等待获取监视器锁用于进入或者重新进入同步代码块或方法。

WAITING : 线程一直等待,直到其他线程执行唤醒操作。

TIMED_WAITING: 线程在特定时间内一直等待,直到超时或者其他线程执行唤醒操作

TERMINATED : 线程已经执行完成。

我们从上面可以看到Java线程的6种状态,那么这6种状态之间是如何切换的呢?

三、Java线程状态间的切换

Java线程状态间切换图如下:

一文搞懂Java的线程生命周期

  1. 当通过Thread类的构造函数生成Thread实例时,此时线程处于NEW状态;
  2. 当调用start()方法时,此时线程处于RUNNABLE状态,在RUNNABLE状态中又有准备就绪和运行中两种状态。
  3. 当处于RUNNABLE状态的线程调用同步方法或同步代码块时,若此时其他线程已经获取了锁,那么该线程转换为BLOCKED状态。当其他线程释放锁,该线程获取到锁时,此时线程从BLOCKED状态转换为RUNNABLE状态。
  4. 当处于RUNNABLE状态的线程调用join()、wait()或LockSupport.park()方法时,线程转换为WAITING状态,当有其他线程执行notify()、notifyAll()或LockSupport.unpark(Thread)方法时,线程又从WAITING转换转换为RUNNABLE状态。
  5. 当处于RUNNABLE状态的线程调用join(long)、wait(long)、LockSupport.parkNanos(long)、LockSupport.parkUntil(long)和Thread.sleep(long)方法时,线程转换为TIMED_WAITING状态,当有其他线程执行notify()、notifyAll()、LockSupport.unpark(Thread)或等待时间已经超过超时时间,线程又从TIMED_WATING状态转换为RUANNBLE状态。
  6. 当线程run方法的逻辑都执行完成后,线程转换到TERMINATED状态。

四、总结

好了,今天我们的介绍就到这了,希望大家通过这篇文章能够把线程的生命周期完全掌握,轻松通过面试,拿下高薪Offer。

一文搞懂Java的线程生命周期

                                                            欢迎关注小强1024实验室,和小强一起用技术改变世界                                                             

相关文章:

  • 2022-01-22
  • 2021-04-22
  • 2021-07-20
  • 2022-12-23
猜你喜欢
  • 2021-05-15
  • 2021-11-03
  • 2021-06-27
  • 2021-07-20
  • 2021-04-19
相关资源
相似解决方案