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 Ctrl-Break线程,有点坑的更多相关文章

  1. -XX:-PrintClassHistogram 按下Ctrl+Break后,打印类的信息

    -XX:+PrintClassHistogram –按下Ctrl+Break后,打印类的信息: num     #instances         #bytes  class name ------ ...

  2. 一个线程可以拿到多个锁标记,一个对象最多只能将monitor给一个线程

    当用Synchronized修饰某个方法的时候,表示该方法都对当前对象加锁. 给方法加Synchronized和用Synchronized修饰对象的效果是一致的. 一个线程可以拿到多个锁标记,一个对象 ...

  3. python 强制结束线程的坑

    网上流传了两种能强制结束线程的错误姿势 第一种:通过setDaemon来结束线程 http://www.cnblogs.com/jefferybest/archive/2011/10/09/22040 ...

  4. How to send CTRL+BREAK signal to detached command-line process

    1.GenerateConsoleCtrlEvent function Sends a specified signal to a console process group that shares ...

  5. 线程那些坑 - HttpContext

    之前记录Log的时候,直接把经常用过的Log帮助类拷贝过来直接用,其中日志的填写路径要么是固定值,然后读取配置文件,要么就是用上下文动态获 System.Web.HttpContext.Current ...

  6. 线程同步 – lock和Monitor

    在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...

  7. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  8. Java线程面试题 Top 50 (转载)

    转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html   本文由 ...

  9. 50 道 Java 线程面试题(转载自牛客网)

    下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理 ...

随机推荐

  1. 8.ExecutorService-执行器服务

  2. session安全&&CBC字符反转攻击&&hash拓展攻击

    session安全 p神写的: 在传统PHP开发中,$_SESSION变量的内容默认会被保存在服务端的一个文件中,通过一个叫"PHPSESSID"的Cookie来区分用户.这类se ...

  3. axios之post提交

    axios官网地址:https://github.com/axios/axios post提交到后台需要做相对应的处理 使用URLSearchParams可以让post 数据提交到后台 对应gitHu ...

  4. 最新版PyCharm激活教程!有效期至2089年!

    Python的编译器有很多,像Pycharm.VsCode.Jupyter...哪个好用不做评价,各有各的优点!用过PyCharm的同学都知道,PyCharm有两大版本,专业版和社区版,专业版相当于社 ...

  5. php 图片转base4的格式

    <?php $url = '1.jpg'; $base64_img = base64_encode(file_get_contents($url));//将图片转base64编码 $imgArr ...

  6. Android小部件Widget开发过程中的坑和总结

    @ 目录 概述 官方参考 效果图 AndroidManifest.xml Receiver Service Options res/xml/ widget_desktop_options.xml 常用 ...

  7. Hadoop框架:HDFS读写机制与API详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.读写机制 1.数据写入 客户端访问NameNode请求上传文件: NameNode检查目标文件和目录是否已经存在: NameNode响应客 ...

  8. Python-获取等差数列

    获取等差数列思路 1. 通过range步长 2. 通过切片步长 # 通过 range series = [i for i in range(1, 101, 2)] print(series) # 通过 ...

  9. mysql-1-select

    #进阶1:基础查询 /* 语法: SELECT 查询列表 FROM 表名; 特点: 1.查询列表可以是:表中字段.常量值.表达式.函数 2.查询的结果是一个虚拟的表格 */ USE myemploye ...

  10. 《Java从入门到失业》第五章:继承与多态(5.1-5.7):继承

    5.继承与多态 5.1为什么要继承 最近我儿子迷上了一款吃鸡游戏<香肠派对>,无奈给他买了许多玩具枪,我数了下,有一把狙击枪AWM,一把步枪AK47,一把重机枪加特林(Gatling).假 ...