public class Test {
public static boolean running =true;
public static void main(String[] args) throws InterruptedException {
new Thread(){
long i =0;
@Override
public void run(){
while(running) {
// System.out.println(running);
i = i + 1;
}
System.out.println(i);
}
}.start();
TimeUnit.SECONDS.sleep(1);
running =false;
System.out.println(1);
}
}
程序无法退出。
原因是running值改变没有被更新到子线程(另一个线程)中。
主线程(右) 不会将数据更新到内存,而子线程(i++)也不会从内存中读取数据,只从L1缓冲层读取
终止(更新)的方式:
0.runnning用volatile修饰
1.将running放在sleep前
2.在子线程中使用running即将他激活,让它得以更新比如使用它(输出,给其他数据赋值)。
3.将boolean型修改为long,条件改为running==1 也是不行,猜测作为条件使用到共享变量时是无法更新数据的
4.将sleep改为TimeUnit.MILLISECONDS.sleep(1)也能退出;
请大佬指点。