详解:idea工具下的main函数只执行Thread.activeCount(),打印值为:2
写多线程的时候,想要等main中其他线程都执行完成后(其他线程功能为对一个数字inc+1),输出最终的inc值。
于是写了个循环:
while (Thread.activeCount() > 1) {
System.out.println(Thread.activeCount());
Thread.yield();
}
System.out.println(test.inc);
结果进入了死循环
于是,main中只写已下代码:
System.out.println(Thread.activeCount()); // 结果为2
原因如下:
// 获取java线程的管理MXBean
ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();
// 不需要获取同步的Monitor和synchronizer信息,仅获取线程和线程堆栈信息
ThreadInfo[] threadInfos = tmxb.dumpAllThreads(false, false);
// 遍历线程信息,打印出ID和名称
for (ThreadInfo info : threadInfos) {
System.out.println("[" + info.getThreadId() + "] " + info.getThreadName());
}
[6] Monitor Ctrl-Break
[5] Attach Listener
[4] Signal Dispatcher
[3] Finalizer
[2] Reference Handler
[1] main
System.out.println(Thread.activeCount());
Thread.currentThread().getThreadGroup().list();
2
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
Thread[Monitor Ctrl-Break,5,main]
可以发现当前线程组包含:main和Monitor Ctrl-Break
所有多线程测试代码如下:
import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger; /**
* java.util.concurrent.atomic包下提供了一些原子操作类,即对基本数据类型进行了封装,保证这些操作是原子性操作
* atomic是利用CAS来实现原子性操作的(Compare And Swap),CAS实际上是利用处理器提供的CMPXCHG指令实现的,
* 而处理器执行CMPXCHG指令是一个原子性操作
*
* @author Jack
* @create 2018-05-04 12:12
**/
public class TestAtomicMain { private static final int THREAD_COUNT = 10; private static final int FOR_COUNT = 10; private static final int THREAD_ACTIVE_COUNT = 2; public AtomicInteger inc = new AtomicInteger(); public void increase() {
inc.getAndIncrement();
} public static void main(String[] args) { final TestAtomicMain test = new TestAtomicMain();
ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder();
ThreadFactory namedThreadFactory = threadFactoryBuilder.setNameFormat("ThreadFactory-%d").build();
ExecutorService singleThreadPool = new ThreadPoolExecutor(THREAD_COUNT, THREAD_COUNT * 2,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024),
namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
for (int i = 0; i < THREAD_COUNT; i++) {
singleThreadPool.execute(() -> {
for (int j = 0; j < FOR_COUNT; j++) {
test.increase();
}
});
}
singleThreadPool.shutdown();
while (Thread.activeCount() > THREAD_ACTIVE_COUNT) {
System.out.println("其他活跃的线程数" + Thread.activeCount());
Thread.yield();
}
System.out.println(test.inc);
}
}
其他活跃的线程数9
其他活跃的线程数3
其他活跃的线程数3
100
达到预期效果
---------------------
原文:https://blog.csdn.net/ke_g3/article/details/80199209
详解:idea工具下的main函数只执行Thread.activeCount(),打印值为:2的更多相关文章
- node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...
- Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用
在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例
SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html 分享到:8 发布时 ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
- 这个贴子的内容值得好好学习--实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化
感觉要DJANGO用得好,ORM必须要学好,不管理是内置的,还是第三方的ORM. 最最后还是要到SQL.....:( 这一关,慢慢练啦.. 实例详解Django的 select_related 和 p ...
- 详解PPP模式下的产业投资基金运作【基金管理】
详解PPP模式下的产业投资基金运作[基金管理] 点击标题下「搏实资本」可快速关注 搏实资本 研究型的投资机构,实操型的专家团队 ﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ 一.产业投资基金概述 ...
- 多玩YY语音的面试题:C++中如何在main()函数之前执行操作?
多玩YY语音的面试题:C++中如何在main()函数之前执行操作? 第一反应main()函数是所有函数执行的开始.但是问题是main()函数执行之前如何执行呢? 联想到MFC里面的 C**App类的t ...
- Dalvik模式下System.loadLibrary函数的执行流程分析
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78212010 Android逆向分析的过程中免不了碰到Android so被加固的 ...
- 全局对象的构造函数会在main 函数之前执行
#include <iostream> using namespace std; class A { public: A() { cout << "Generator ...
随机推荐
- 201671010142 2017-2 《java第十一章学习感悟》
事件处理基础 事件源,事件监听器,事件监听器 监听器接口的实现,监听器对象所属类必须实现与事件源相对应的接口,即必须提供接口中方法的实现. 适配器类 当程序用户试图关闭一个框架窗口时,Jframe对 ...
- HTTP与HTTPS有哪些区别?
大纲 这里写图片描述一.前言: 这里写图片描述这里写图片描述先来观察这两张图,第一张访问域名http://www.12306.cn,谷歌浏览器提示不安全链接,第二张是https://kyfw.1230 ...
- SSH整合后tomcat启动报错SEVERE: Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
错误信息: SEVERE: Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/C ...
- DAY6:文件读取
文件读取: f = open("文件名","r",encoding="utf-8").read()#文件读取 print(f) 写入文件 ...
- java 每间隔一段时间执行一段代码
Java中java.util.Timer类中有若干个schedule的重载方法,其中 void schedule(TimerTask task, long delay, long period ) 安 ...
- FCC JS基础算法题(5):Return Largest Numbers in Arrays(找出多个数组中的最大数)
题目描述: 找出多个数组中的最大数右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组.提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组 ...
- centos7 十万并发 关健配置
vim /etc/sysctl.conf,添加 --开机启动加载内核参数:fs.file-max = 65535kernel.sem=250 32000 100 128 /proc/sys/kerne ...
- 大数字加法(hduoj)
Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...
- Element-ui 更新tableData 中 row的某一个属性时,没有更新视图的问题
在一个报警音管理的页面中,每次点击试听的时候,需要把‘试听’ 更新为 ‘停止’, 起初我们给row.play=0时,显示为 试听,row.play=1时显示为停止, 但是在代码中每次为row.play ...
- 调试利器GDB(下)
本节我们研究gdb更深层的用法: 数据断点: 可以根据变量的值来监视变量. 数据断点本质是硬件断点,数量有限. watch var_name告诉gdb我们关注var_name这个变量,如果它的值被改变 ...