JVM:start()遇到join(),执行顺序

  • Post author:
  • Post category:其他


最近在学jvm,今天看到一段代码,如下:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicClass {
    static int n = 0;
    public static void main(String[] args) throws InterruptedException {
        int j = 0;
        while(j<100){
            n = 0;
            Thread t1 = new Thread(){
                public void run(){
                    for(int i=0; i<10; i++){
                        System.out.println("线程1");
                        n++;
                    }
                }
            };
            Thread t2 = new Thread(){
                public void run(){
                    for(int i=0; i<10; i++){
                        System.out.println("线程2");
                        n++;
                    }
                }
            };
            t1.start();
            t2.start();
            System.out.println("线程1是否活着:"+t1.isAlive());
            System.out.println("线程2是否活着:"+t2.isAlive());
            t1.join();
            System.out.println("线程1是否活着:"+t1.isAlive());
            System.out.println("线程2是否活着:"+t2.isAlive());
            t2.join();
            System.out.println("线程1是否活着:"+t1.isAlive());
            System.out.println("线程2是否活着:"+t2.isAlive());
            System.out.println("n的最终值是:"+n);
            j++;
        }
    }
}

如上图,先启动t1、t2两个线程,然后分别调用join方法。那么问题来了:

jvm是会先执行t1、t2两个线程run()方法里面的语句?还是先执行后面的join()方法?

抱着这个想法,在不同位置添加了isAlive()方法进行测试,运行一百遍,运行截图如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里只截图了几次具有代表性的。从上面截图我们明显可以看到,

线程在join()方法以前也会开始执行

,此处完全根据cpu的调度情况,而不是固定的。其实在截图中我们可以看到更多结果:

t1.join()结束后,不一定会去马上执行t2.join(),而是运行t2的run();

t1、t2线程可能在join()方法以前就运行结束了;



版权声明:本文为qq_41623154原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。