Monitor Ctrl-Break线程,有点坑

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

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

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

Monitor Ctrl-Break线程,有点坑

下面是全部的代码:

  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 }

结果:Monitor Ctrl-Break线程,有点坑

 

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

Thread.State.TERMINATED

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

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

Thread.activeCount()

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

Thread.activeCount()

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

if (i == 2) {
  break;
}

 Monitor Ctrl-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 Ctrl-Break线程,有点坑

 

上一篇:Nightingale——修改报警中的报警策略报警详情域名


下一篇:多元线性回归预测房价