package com.yjyz.common.virtual.callcenter.web;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* @Description:
* q1:以下代码为什么不会结束线程?
* a:当开启了一个线程 CPU 会去读取 flag 属性,而flag在线程之外,cpu会首先找到flag所在对象堆中的地址,
* 然后再去找flag的地址,而while方法中又是空方法,Jvm会认为你的方法没啥卵用,为了节省开销,
* 从而隐式定义了一个 bool = flag,不用每次再去寻找
* 而之后的flag 的变更,隐式的 bool 值并没有改变,所以导致了没有结束该线程
*
* q2:如果while空方法体,注释sleep 为什么又会结束?(过)
* a:理论上说,80%先执行主线程,再执行子线程,但是自线程依然可能会执行,但是没人能证实为什么会结束
*
* q3:为什么增加 System.out.println(i);会自动结束方法呢?
* a:Jvm存在方法调用,Jvm会认为,存在方法溢出,不会去自动优化
*
* q4:为什么不调用System.out.println(i); 仅仅使用i++;又会停止呢?
* a:不存在方法溢出
* @Param:
* @return:
* @Author: Feng/18772115902
* @Date:
*/
public class Test {
private static boolean flag = true;
private static Thread thread;
private static int i = 0;
public static void main(String[] args) throws InterruptedException {
myThread();
thread.start();
// thread.sleep(100);
flag = false;
}
public static void myThread(){
thread = new Thread(){
@Override
public void run(){
while (flag){
i++;
// System.out.println(i);
}
}
};
}
}
网友评论