关于多线程的一些测试Thread.activeCount()

 

Thread类的activeCount()方法用于返回当前线程的线程组中活动线程的数量。返回的值只是一个估计值,因为当此方法遍历内部数据结构时,线程数可能会动态更改。
 

public class TestMain {

   static public class MyAtomicInteger{
        AtomicInteger integer =new AtomicInteger();
        public void plusOne(){
            integer.getAndIncrement();
        }
    }

    public static void main(String[] args) {
        MyAtomicInteger myAtomicInteger=new MyAtomicInteger();
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    myAtomicInteger.plusOne();
                   // System.out.println("1.0 : "+myAtomicInteger.integer.get());
                }
            }).start();
        }
        if(Thread.activeCount()>=2){
            System.out.println("2.0:"+Thread.activeCount());
            Thread.yield();
            System.out.println("3.0:"+Thread.activeCount());
        }
        /*while (Thread.activeCount() > 2) {
            System.out.println("其他活跃的线程数" + Thread.activeCount());
            Thread.yield();
        }*/
        System.out.println(myAtomicInteger.integer.get());
    }
}

执行结果:不等于20000,只执行一次if判断可能子线程没有执行完主线程就已经结束了,最后结果不一致,只要最后输出之前加

Thread.sleep(10000);一样能输出20000

public class TestMain {

   static public class MyAtomicInteger{
        AtomicInteger integer =new AtomicInteger();
        public void plusOne(){
            integer.getAndIncrement();
        }
    }

    public static void main(String[] args) {
        MyAtomicInteger myAtomicInteger=new MyAtomicInteger();
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    myAtomicInteger.plusOne();
                    System.out.println("1.0 : "+myAtomicInteger.integer.get());
                }
            }).start();
        }
        if(Thread.activeCount()>=2){
            System.out.println("2.0:"+Thread.activeCount());
            Thread.yield();
            System.out.println("3.0:"+Thread.activeCount());
        }
      /*  while (Thread.activeCount() > 2) {
            System.out.println("其他活跃的线程数" + Thread.activeCount());
            Thread.yield();
        }*/
        System.out.println(myAtomicInteger.integer.get());
    }
}

执行结果:

System.out.println("1.0 : "+myAtomicInteger.integer.get());这句话加上以后输出结果就变成了20000了,我把System.out.println去掉,返回结果又变成一个不确定的数字了,由此可见System.out.println会阻塞主线程的运行,可参考https://blog.csdn.net/weixin_34232617/article/details/85957619

public class TestMain {

   static public class MyAtomicInteger{
        AtomicInteger integer =new AtomicInteger();
        public void plusOne(){
            integer.getAndIncrement();
        }
    }

    public static void main(String[] args) {
        MyAtomicInteger myAtomicInteger=new MyAtomicInteger();
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    myAtomicInteger.plusOne();
                  //  System.out.println("1.0 : "+myAtomicInteger.integer.get());
                }
            }).start();
        }
        /*if(Thread.activeCount()>=2){
            System.out.println("2.0:"+Thread.activeCount());
            Thread.yield();
            System.out.println("3.0:"+Thread.activeCount());
        }*/
        while (Thread.activeCount() > 2) {
            System.out.println("其他活跃的线程数" + Thread.activeCount());
            Thread.yield();
        }
        System.out.println(myAtomicInteger.integer.get());
    }
}

执行结果:

加上while (Thread.activeCount() > 2)后,主线程就会一直在此循环里,知道子线程执行完并且Thread.activeCount() 小于2了,就会执行完,结果就是我们预期的20000

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值