Monitor Ctrl-Break线程,有点坑
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线程,有点坑的更多相关文章
- -XX:-PrintClassHistogram 按下Ctrl+Break后,打印类的信息
-XX:+PrintClassHistogram –按下Ctrl+Break后,打印类的信息: num #instances #bytes class name ------ ...
- 一个线程可以拿到多个锁标记,一个对象最多只能将monitor给一个线程
当用Synchronized修饰某个方法的时候,表示该方法都对当前对象加锁. 给方法加Synchronized和用Synchronized修饰对象的效果是一致的. 一个线程可以拿到多个锁标记,一个对象 ...
- python 强制结束线程的坑
网上流传了两种能强制结束线程的错误姿势 第一种:通过setDaemon来结束线程 http://www.cnblogs.com/jefferybest/archive/2011/10/09/22040 ...
- 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 ...
- 线程那些坑 - HttpContext
之前记录Log的时候,直接把经常用过的Log帮助类拷贝过来直接用,其中日志的填写路径要么是固定值,然后读取配置文件,要么就是用上下文动态获 System.Web.HttpContext.Current ...
- 线程同步 – lock和Monitor
在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- Java线程面试题 Top 50 (转载)
转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html 本文由 ...
- 50 道 Java 线程面试题(转载自牛客网)
下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理 ...
随机推荐
- Apache Flink on K8s:四种运行模式,我该选择哪种?
1. 前言 Apache Flink 是一个分布式流处理引擎,它提供了丰富且易用的API来处理有状态的流处理应用,并且在支持容错的前提下,高效.大规模的运行此类应用.通过支持事件时间(event-ti ...
- 原子类CAS的底层实现
原子类使用 public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger = ...
- JVM学习(二)JVM加载类
一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- Linux/(centos、unix等)的ssh双向免密登录原理和实现
原理: 双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录. 双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他 ...
- Go-archive/tar: write after close gopher.txt
where? 在使用Go中tar包循环写入内容的时候 why? 因为已经关闭了tar.writer对象,所以无法写入,但是程序还是有写入操作,所以报错 way? 通过 defer关键字来管理资源的释放 ...
- 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源(二)
之前写过一篇 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源,在那之后,又陆续想到并实施了几点利用 jsDelivr 进一步加速静态资源加载的措施,新起一篇作为记录和分享. ...
- 【题解】[USACO08MAR]Land Acquisition G
Link 题目大意:给定\(n\)个二元组,每次可以选择一组,花费是组内最大的长乘以最大的宽.问消掉所有二元组的最小代价. \(\text{Solution:}\) \(dp\)写的不够啊-- 先挖掘 ...
- 跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)
前言 来啦,老弟?来啦,上一篇就当唠唠嗑,接下来就开始进行实操撸命令,计划是先整体单纯说说Redis的各种用法和应用,最后再结合代码归纳总结. Redis默认有16个数据库(编号为0~15),默认使用 ...
- excel——VlookUp函数的使用
VlookUp函数,查询两个表中的相同字段数据,并将需要引用的数据从B表填充到A表 1.打开A表,将需要查询的列选中 在需要引用的列输入 = 在上方,函数选择中选择VLOOKUP函数 Windows: ...
- 草率了,又一个Maven打包的问题
经常遇到 Maven 相关的问题,这是之前的文章: 这个 Maven 依赖的问题,你敢说你没遇到过:https://mp.weixin.qq.com/s/SzBbDtyRUrk_7LH8SUbGXQ ...