关于多线程的一些测试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

关于多线程的一些测试Thread.activeCount()_第1张图片

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

关于多线程的一些测试Thread.activeCount()_第2张图片

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

关于多线程的一些测试Thread.activeCount()_第3张图片

你可能感兴趣的:(个人体会)