既然每个线程有自己的工作内存为什么我执行下面代码的时候主内存变量的更改能够影响线程
为什么会执行到 System.out.println(num+"*****************线程终止************");
还有为什么我把System.out.println(num);一行注释掉就永远停止不了了
那么Java到底在什么时间执行read和load、store和write
public class CourrTest02 extends Thread{
private static long num=0;
private boolean a=true;
@Override
public void run() {
while(num!=10001){
//
System.out.println(num);
}
System.out.println(num+"*****************线程终止************");
}
public static void main(String[] args) throws InterruptedException {
boolean b=true;
CourrTest02 c1=new CourrTest02();
c1.start();
Thread.sleep(1000);
for(int i=0;i<10000;i++){
c1.num=10001;
}
}
}
我觉得吧。你确实写的是c1.num = 10001。而且num定义的位置确实应该会影响到线程的运行吧。
至于为什么注掉了System.out.println(num)会导致停步下来。我觉得可能和线程抢占有关吧。在打印的时候会阻塞这个线程,就会执行到c1.num= 10001。
-- 才疏学浅,就能分析这么多了。
为什么会执行到 System.out.println(num+"*****************线程终止************");
因为num对于以上两个线程都是共享的,主线程的c1.num=10001;会作用到子程序中去。
还有为什么我把System.out.println(num);一行注释掉就永远停止不了了
至于这个问题,主要是对while(num!=10001)的优化导致,如果将num改成volatile或加System.out.println("num!=10001");就照样会停下来
java线程是不可控制的,除非你停掉当前程序,有可能会停止,你只能控制它的执行内容不能控制它执行的时间