最近在学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()方法以前就运行结束了;