写多线程的时候,想要等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的更多相关文章

  1. node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...

  2. Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用

    在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...

  3. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  4. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  5. 这个贴子的内容值得好好学习--实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

    感觉要DJANGO用得好,ORM必须要学好,不管理是内置的,还是第三方的ORM. 最最后还是要到SQL.....:( 这一关,慢慢练啦.. 实例详解Django的 select_related 和 p ...

  6. 详解PPP模式下的产业投资基金运作【基金管理】

       详解PPP模式下的产业投资基金运作[基金管理]     点击标题下「搏实资本」可快速关注 搏实资本 研究型的投资机构,实操型的专家团队 ﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ 一.产业投资基金概述 ...

  7. 多玩YY语音的面试题:C++中如何在main()函数之前执行操作?

    多玩YY语音的面试题:C++中如何在main()函数之前执行操作? 第一反应main()函数是所有函数执行的开始.但是问题是main()函数执行之前如何执行呢? 联想到MFC里面的 C**App类的t ...

  8. Dalvik模式下System.loadLibrary函数的执行流程分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78212010 Android逆向分析的过程中免不了碰到Android so被加固的 ...

  9. 全局对象的构造函数会在main 函数之前执行

    #include <iostream> using namespace std; class A { public: A() { cout << "Generator ...

随机推荐

  1. MSSQL转Mysql常用函数,语法等

    MSSQL转Mysql常用 一.字段类型 MSSQL Mysql 备注 "nchar" "char()" 最大长度为255 "nvarchar&quo ...

  2. HOU 1012

    #include<iostream>using namespace std;int main(void){ int jiecheng[10]; jiecheng[0]=jiecheng[1 ...

  3. 考研计算机复试(C语言复试笔试题)(精华题选)

    1.以下选择中,正确的赋值语句是(C) A.a=1,b=2 B.j++ C.a=b=5; D.y=(int)x 解析:选项A.B.D都无分号 变量 = 表达式;//赋值语句是一定带分号的 int a= ...

  4. 作业:K-means算法应用:图片压缩

    from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib. ...

  5. ImportError: No module named _tkinter, please install the python-tk package ubuntu运行tkinter错误

    这是由于Python的版本没有包含tkinter的模块,只需要把tk的package安装就可以了. 一般在Linux才出现,windows版本一般已经包含了tkinter模块. apt-get ins ...

  6. PLC之六部十层电梯整体框架

    1.基本框架 此图基于西门子杯逻辑控制赛项中电梯题目的变量表以及功能设计 1.I/O输入是指变量表中的input数字量,包括电梯所有的内呼按钮.外呼按钮.电梯平层开关等 2.逻辑处理是指根据相对应的输 ...

  7. 用less编写百度搜索静态效果

    效果图 html页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. MySQL data sync to Oracle with OGG(Remote Delivery)

    MySQL to Oracle with OGG 1. Install MySQL: yum install mysql-community-server [root@localhost ~]#  y ...

  9. PYTHON 实现的微信跳一跳【辅助工具】仅作学习

    备注原地址:https://my.oschina.net/anlve/blog/1604163 我又做了一些优化,防止WX检测作弊 准备环境: Windows 10安卓手机,源码中有适配ios,然后链 ...

  10. PHP 位运算

    $a & $b    a,b二进制后,取得每对应为都有1的部分,然后再转换为十进制 $a | $b      a,b二进制后,取得每对应为只要有1的部分,然后再转换为十进制 $a >&g ...