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()); } } }