ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Monitor Ctrl-Break线程,有点坑

2020-10-26 08:32:43  阅读:182  来源: 互联网

标签:状态 Monitor thread Thread Break state 线程 println


Monitor Ctrl-Break线程这个在idea中特有的线程,你了解吗?这线程可能会在你调试的时候给你带来谜一样的结果,为什么呢?请看下面的例子:

首先我们先复习一下多线程的状态(因为这个问题是我在复习多线程的时候发现的问题)

对于线程的所有状态该如何去查看呢?线程的状态都是怎么产生的这些面试高频题目,我们是否还记得呢?下面附上代码用代码再一次复习一下,简单明了。

下面是全部的代码:

  1 /**
  2  * @Description: 查看线程的所有状态
  3  * @ProjectName: demo
  4  * @Package: com.thread
  5  * @Author: XiaoHeMa
  6  * @CreateDate: 2020/10/24 9:03
  7  */
  8 
  9 public class ThreadSate {
 10 
 11  
 12 
 13     public static void main(String[] args) {
 14 
 15         Thread thread = new Thread(() -> {
 16 
 17             for (int i = 0; i < 5; i++) {
 18 
 19                 try {
 20 
 21                     Thread.sleep(100);
 22 
 23                 } catch (InterruptedException e) {
 24 
 25                     e.printStackTrace();
 26 
 27                 }
 28 
 29             }
 30 
 31             System.out.println("---thread线程结束---");
 32 
 33         });
 34 
 35         //查看线程的状态
 36 
 37         Thread.State state = thread.getState();
 38 
 39         //这时候我们只是创建了个线程 也就是NEW的状态
 40 
 41         System.out.println("线程状态  " + state);
 42 
 43         //启动线程
 44 
 45         thread.start();
 46 
 47         //查看线程的状态
 48 
 49         state = thread.getState();
 50 
 51         //这时候我们已经启动了线程,然后来看看现在线程的状态 RUNNABLE
 52 
 53         System.out.println("线程状态  " + state);
 54 
 55  
 56 
 57  
 58 
 59  
 60 
 61           //根据线程的状态来停止死循环
 62 
 63 //        while (state != Thread.State.TERMINATED) {
 64 
 65 //            try {
 66 
 67 //                Thread.sleep(200);
 68 
 69 //            } catch (InterruptedException e) {
 70 
 71 //                e.printStackTrace();
 72 
 73 //            }
 74 
 75 //            //查看线程的状态
 76 
 77 //            state = thread.getState();
 78 
 79 //            System.out.println("线程状态  " + state);
 80 
 81 //        }
 82 
 83  
 84 
 85  
 86 
 87         //根据线程的总条数来停止死循环
 88 
 89         while (true) {
 90 
 91             int i = Thread.activeCount();
 92 
 93             System.out.println("目前线程数量:" + i);
 94 
 95             /**
 96              * Monitor Ctrl-Break这个线程只会在IDEA中被打印出来
 97              * 在IDEA中通过debug启动的不会出现,只有run启动的会出现
 98              * 所以在idea中执行run的时候这个要写成2而不能是1在eclipse
 99              * 中却不会出现这个问题,这是软件引起的在开发调试过程要注意。
100              */
101 
102             if (i == 2) {
103 
104                 break;
105 
106             }
107 
108             try {
109 
110                 Thread.sleep(200);
111 
112             } catch (InterruptedException e) {
113 
114                 e.printStackTrace();
115 
116             }
117 
118             //查看线程的状态
119 
120             state = thread.getState();
121 
122             System.out.println("线程状态  " + state);
123 
124         }
125 
126  
127 
128  
129 
130     }
131 
132 }

结果:

 

对于代码中有检验的方式:一种是

Thread.State.TERMINATED

采用线程的状态来判断线程是否结束

另一种是通过线程的数量来判断线程的数量

Thread.activeCount()

注意(使用idea的小伙伴要注意了,在idea中使用

Thread.activeCount()

debug启动的不会出现,只有run启动的会出现,出现线程数最后有2条的问题,所以在上面的代码中才用

if (i == 2) {
  break;
}

 

 

Monitor Ctrl-Break线程是在idea中才有的,而且还是要用run启动方式,所以在写测试代码的小伙伴要注意了!!!

测试代码

public class Main extends Thread {
    public static void main(String[] args) {
        Main t1 = new Main();
        t1.setName("thread01");
        t1.start();
        ThreadGroup currentGroup =
                Thread.currentThread().getThreadGroup();
        int noThreads = currentGroup.activeCount();
        Thread[] lstThreads = new Thread[noThreads];
        currentGroup.enumerate(lstThreads);
        for (int i = 0; i < noThreads; i++) {
            System.out.println("线程号:" + i + " = " + lstThreads[i].getName());
        }
    }
}

  

 

标签:状态,Monitor,thread,Thread,Break,state,线程,println
来源: https://www.cnblogs.com/hpdblogs/p/13876624.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有