Java线程的六种状态

快来打我* 2022-10-17 04:12 313阅读 0赞

上一篇:线程的基本使用

线程的状态

创建线程后调用start方法会启动线程执行run方法里的任务,执行完毕后线程就结束了。因此,线程从创建到启动再到结束,中间会有好几种状态。

先看源码,如下图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1emhpcWlhbmdfMTk5Mw_size_16_color_FFFFFF_t_70

可以看到,线程的状态有6种。

NEW : 一个新创建但是尚未启动的线程

  1. new Thread();

如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1emhpcWlhbmdfMTk5Mw_size_16_color_FFFFFF_t_70 1


RUNNABLE:正在运行或准备执行的线程

  1. new Thread().start();

如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1emhpcWlhbmdfMTk5Mw_size_16_color_FFFFFF_t_70 2


BLOCKED: 阻塞状态,等待获取synchronized锁继续执行的线程(只有在synchronized修饰时才会出现该状态

例如,两个线程执行同一个同步方法,线程1先执行,线程2执行的时候需要等线程1执行完毕释放锁资源后才有机会继续执行,此时,线程2就处于阻塞状态。

示例如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1emhpcWlhbmdfMTk5Mw_size_16_color_FFFFFF_t_70 3


WAITING: 等待其他线程执行完任务然后继续执行的线程

日常开发这个是比较常见的例子:例如,一个页面需要调好几个接口来加载数据,其中接口2的参数需要从接口1的返回值拿,那么在用多线程执行的时候,接口2的线程就要等待接口1的线程先执行完毕。此时,接口2的线程就处于等待状态

示例代码:

  1. public class TestState {
  2. private static Thread thread1;
  3. private static Thread thread2;
  4. public static void main(String[] args) throws InterruptedException {
  5. thread1 = new Thread(() -> {
  6. System.out.println("线程1 开始执行");
  7. try {
  8. /*合并线程,此时线程会等待线程2执行完毕*/
  9. thread2.join();
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. System.out.println("线程1 执行完毕");
  14. });
  15. thread2 = new Thread(() -> {
  16. try {
  17. System.out.println("线程2开始执行");
  18. System.out.println("线程1的状态:" + thread1.getState());
  19. Thread.sleep(3000);
  20. System.out.println("线程2执行完毕");
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. });
  25. thread1.start();
  26. thread2.start();
  27. }
  28. }

20210605163852944.gif


TIMED_WAITING: 定时等待,等待另一个线程执行固定时长的线程。

还是上面的代码 稍微改改,如下:

  1. public class TestState {
  2. private static Thread thread1;
  3. private static Thread thread2;
  4. public static void main(String[] args) throws InterruptedException {
  5. thread1 = new Thread(() -> {
  6. System.out.println("线程1 开始执行");
  7. try {
  8. /*合并线程,此时线程会等待线程2执行完毕*/
  9. thread2.join(1000);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. System.out.println("线程1 执行完毕");
  14. });
  15. thread2 = new Thread(() -> {
  16. System.out.println("线程2开始执行");
  17. System.out.println("线程1的状态:" + thread1.getState());
  18. // Thread.sleep(3000);
  19. System.out.println("线程2执行完毕");
  20. });
  21. thread1.start();
  22. thread2.start();
  23. }
  24. }

运行结果如下:

20210605164700400.png


TERMINTED:正常运行结束的线程或出异常的线程

示例代码:

  1. public static void main(String[] args) throws InterruptedException {
  2. Thread thread = new Thread(() -> {
  3. System.out.println("线程开始执行");
  4. try {
  5. Thread.sleep(1000);
  6. } catch (InterruptedException e) {
  7. e.printStackTrace();
  8. }
  9. System.out.println("线程执行结束");
  10. });
  11. thread.start();
  12. /*合并线程 等待当前线程执行完毕*/
  13. thread.join();
  14. System.out.println(thread.getState());
  15. }

运行结果:

20210605165159527.png


好了,线程的状态就是这些,来总结一下:


































线程状态 状态说明
NEW 新创建的线程,还没有调start
RUNNABLE 待运行或正在运行中的线程
BLOCKED 阻塞状态,等待获取synchronized锁的线程
WAITING 等待其他线程执行完毕然后继续执行的线程,比如调用了wait,join等方法
TIMED_WAITING

处于等待指定时长的线程,比如调用了sleep(time)、wait(time)、join(time)等方法

TERMINATED 正常执行完毕或出现异常的线程

下一篇:

线程休眠 (sleep)


如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客,谢谢!

发表评论

表情:
评论列表 (有 0 条评论,313人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线状态

    上一篇:[线程的基本使用][Link 1] 线程的状态 创建线程后调用start方法会启动线程执行run方法里的任务,执行完毕后线程就结束了。因此,线程从创建到启动再到