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) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理 ...
随机推荐
- Mybatis是如何将Mapper接口注册到Spring IoC的
1. 前言 有时候我们需要自行定义一些注解来标记某些特定功能的类并将它们注入Spring IoC容器.比较有代表性的就是Mybatis的Mapper接口.假如有一个新的需求让你也实现类似的功能你该如何 ...
- 趣图:当我修复一个隐藏Bug之后
当我修复一个隐藏Bug时 然后,陷入了死循环中.... 扩展阅读 趣图:大佬如何解决bug的 趣图:快下班了,剩一个bug,修复一下再走 趣图:当我给老板展示我修复了那个 bug 时 趣图:当同事 ...
- LazySysAdmin 靶机渗透
Vulnhub-LazySysAdmin 靶机渗透 发现六个开放的端口,分别为22,80,139,445,3306以及6667. 139/tcp open netbios-ssn Samba smbd ...
- Android作业 0923
计算器小应用 package com.example.myhomework2; import androidx.appcompat.app.AppCompatActivity; import andr ...
- ABP VNext从单体切换到微服务
注:此处的微服务只考虑服务部分,不考虑内外层网关.认证等. ABP VNext从单体切换到微服务,提供了相当大的便利性,对于各模块内部不要做任何调整,仅需要调整承载体即可. ABP can help ...
- webservice了解一下!!
(1)什么是webservice? webservice是一种可以跨编程语言和跨平台进行远程调用的一种技术,是同步进行. webservice主要分为两种,一种是基于浏览器的瘦客户端应用程序,一种是基 ...
- 「ExLucas」学习笔记
「ExLucas」学习笔记 前置芝士 中国剩余定理 \(CRT\) \(Lucas\) 定理 \(ExGCD\) 亿点点数学知识 给龙蝶打波广告 Lucas 定理 \(C^m_n = C^{m\% m ...
- OpenCV 中Scalar
参考来源: 1.https://blog.csdn.net/Eroslol/article/details/52525541 2.https://www.cnblogs.com/hustdc/p/68 ...
- Linux 安装Navicat Premium 15
参考:https://gitee.com/andisolo/navicat-keygen 安装 aptitude 管理软件 $ sudo apt-get install aptitude 安装Navi ...
- nuget使用经验:复杂依赖关系下的包版本问题
背景 之前同事问到过1个关于nuget包被多层引用后,最终生效的版本的问题.当时通过在项目中重新安装了一次nuget包解决了. 现在来重新复盘一下当时的场景,顺便把这种场景下nuget处理逻辑分享给大 ...