public class NoVisibility {
private static boolean ready=false;
private static int number;
private static class ReaderThread extends Thread {
public ReaderThread() {
System.out.println("Thread is created");
} public void run() {
int i=0;
while(!ready) {
i++;
Thread.yield();
System.out.println(number);
if(i==9) break;
}
}
}
public static void main(String[] args) {
ReaderThread s=new ReaderThread();
s.start();
System.out.println("main output context");
number = 42;
ready = true;
}
}为什么如上代码的运行结果总是:
Thread is created
main output context
而不是我想要的:
Thread is created
1
2
3
4
5
6
7
8
9
main output context
private static boolean ready=false;
private static int number;
private static class ReaderThread extends Thread {
public ReaderThread() {
System.out.println("Thread is created");
} public void run() {
int i=0;
while(!ready) {
i++;
Thread.yield();
System.out.println(number);
if(i==9) break;
}
}
}
public static void main(String[] args) {
ReaderThread s=new ReaderThread();
s.start();
System.out.println("main output context");
number = 42;
ready = true;
}
}为什么如上代码的运行结果总是:
Thread is created
main output context
而不是我想要的:
Thread is created
1
2
3
4
5
6
7
8
9
main output context
所以main永远会优先执行.
private static boolean ready=false;
private static int number; private static class ReaderThread extends Thread {
public ReaderThread() {
System.out.println("Thread is created");
} public void run() {
int i=0;
while(ready) {
i++;
number=i;
Thread.yield();
System.out.println(number); if(i==9) break;
}
}
} public static void main(String[] args) {
ReaderThread s=new ReaderThread();
s.start();
System.out.println("main output context");
number = 42;
ready = true;
}
} 把while(!ready)改为while(ready)
这样就不可能进入while循环了
System.out.println(number); 输出不是0就是42也不可能是1-9
public class Test {
private static boolean ready = false; private static int number; private static class ReaderThread extends Thread {
public ReaderThread() {
System.out.println("Thread is created");
} public void run() {
int i = 0;
while (!ready) {
i++;
Thread.yield();
System.out.println(i);
if (i == 9)
break;
}
}
} public static void main(String[] args) {
ReaderThread s = new ReaderThread();
s.start();
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("main output context");
number = 42;
ready = true;
}}
或者和我在2楼做一样的更改或者把main()方法里的ready = true; 注释掉因为main()优先执行,所以当运行RUN方法时的ready实际为true而不是初始化值的false
在这个时候MAIN方法的
System.out.println("main output context");
number = 42;
ready = true;
执行了.
从此以后while(!ready)永远也进不去了,因为ready = true,明白没?
注意这里print的是number 只可能是0或者42
2.lz的程序里,main函数优先执行,number = 42;ready = true; 然后才执行的ReaderThread.run()。
3.前面已经有人提出了方案 Thread.sleep(1000);就是要main等待一下,此时会执行run();
去掉就好了,如果你只是希望它执行的慢一点,用sleep
resume() 放开阻塞——之后线程又可以分到CPU时间了