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. MybatisPlus根据模板生成器代码

    导读 网上的代码生成器,都不是自己想要的,今天下午研究了下,可以使用mybatisplus自定义模板,根据模板生成相应的代码,可以根据需求,改造相应模板即可.代码已上传github/百度云. 项目结构 ...

  2. 使用jsonify返回json数据

    from flask import Flask, jsonify app = Flask(__name__) json_data = [ {"name":"json&qu ...

  3. RabbitMq如何确保消息不丢失

    上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情.网络故障.服务器重启.硬盘损坏等都会导致消息的丢失.消息从生产到消费主要结果以下几个阶段如下图. ①生产 ...

  4. P2947 Look Up S

    题目描述: 约翰的N(1≤N≤10^5)头奶牛站成一排,奶牛i的身高是Hi(l≤Hi≤1,000,000).现在,每只奶牛都在向右看齐.对于奶牛i,如果奶牛j满足i<j且Hi<Hj,我们可 ...

  5. 04 C语言基本语法

    C语言的令牌 C 语言的程序代码由各种令牌组成,令牌可以是关键字.标识符.常量.字符串值,或者是一个符号.例如,下方的C语句包括5个令牌: printf("Hello, World! \n& ...

  6. matlab中reshape 重构数组

    来源:https://ww2.mathworks.cn/help/matlab/ref/reshape.html?searchHighlight=reshape&s_tid=doc_srcht ...

  7. 【题解】[NOI2011]阿狸的打字机

    阿狸的打字机 \(\text{Solution:}\) 首先观察三种操作:一种是插入一个字符,一种是退回上一步(回到父亲节点). 所以,我们可以对操作串进行模拟,并处理出每一个串在树上的位置. 接下来 ...

  8. LNMP架构介绍与部署

    一.LNMP架构介绍 LNMP:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器.My ...

  9. axio跨域请求,vue中的config的配置项。

    这是我用 vue cli 脚手架搭建的跨域.以上是可以请求到的.

  10. Linux系统常用API总结

    1.错误处理 - fprintf() - perror() 2.通用I/O模型 - fd = open(pathname, flags, mode) - numread = read(fd, buff ...