In Java Concurrency in Practice there is a sample that made me confused:
public class Novisibility {
private static boolean ready;
private static int number;
private static class ReaderThread implements Runnable {
public void run() {
while (!ready) {
Thread.yield();
}
System.out.println(number);
}
}
public static void main(String[] args) {
System.out.println("0");
new Thread(new ReaderThread()).run();
System.out.println("1");
number = 42;
System.out.println("2");
ready = true;
System.out.println("3");
}
}
I can understand reordering makes the loop to never break, but I can’t understand why “1”, “2” and “3” are never printed to console. Could any body help?
You don’t spawn a new thread but run it in the current one. Use the
start()method instead.Since you
run()executes on the main thread and that method runs in an endless loop you’ll never reach theSystem.out.println()statements (and neither do you reachready = true;).From the JavaDoc on
run():And
start():