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. @JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  2. PostGreSQL不同索引类型(btree & hash)的性能问题

    在关系型数据库调优中,查询语句涉及到的索引类型是不得不考虑的一个问题.不同的类型的索引可能会适用不同类型的业务场景.这里我们所说的索引类型指的是访问方法(Access Method),至于从其他维度区 ...

  3. Jackson反序列化枚举类型解决方案

    BUG描述 在使用SpringBoot自带的jackson处理客户端提交的消息体反序列化时,遇到一个非常棘手的情况 客户端发送如下json {"content":"654 ...

  4. 原子类的 ABA 问题

    原子引用 public class AtomicReferenceDemo { public static void main(String[] args) { User cuzz = new Use ...

  5. vue项目中视频播放结束返回首页出现1秒左右的白屏问题

    vue项目的性能优化问题,一直以来都是大家比较关注的. 近日负责的项目中,使用了SignalR实时通讯,客户端中点击发起播放视频的请求到服务器,服务器接到请求后再调用前端的播放视频方法,以此来达到播放 ...

  6. Java基础——缓存

    1.缓存 将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度 以目前的系统架构来说,用户的请求一般会先经 ...

  7. Spring学习(十一)--Spring MVC

    1.MVC模式 (1)视图 通过视图展示应用数据    向应用数据提供更新动作   向控制器提交用户动作   运行控制器选择不同视图 (2)模型提供 封装应用数据状态  响应数据状态查询  提供应用功 ...

  8. 学习Maven有感

    1.maven的由来 maven是一款服务于java平台的自动化构建工具 构建定义:把动态的Web工程经过编译得到的编译结果部署到服务器上的整个过程. 编译:java源文件[.java]->编译 ...

  9. python3 读取写入excel操作-win32com

    前面有写一篇是用xlrd操作excel的,这一篇是使用win32com来进行操作excel,个人推荐使用win32com. 要使用win32com组件,也需要先导入win32com包. # -*- c ...

  10. 编辑 编译 乱码 透彻 讲解 keil vscode notepad++

    1. 2.此时VSCODE内的改文件是乱码现象,进行如下操作,选择 通过编码重新打开, 选择GB 2312即可.(GB2312是兼容ANSI编码的) 详细解释一下: KEIL内是ANSI编码,VSCO ...