Вот мой код
public class Test {
private static boolean running = true;
public static void main(String[] args) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "get running:" + running);
while (running) {
}
System.out.println(Thread.currentThread().getName() + "end");
}, "t1").start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
running = false;
System.out.println(Thread.currentThread().getName() + "change running to:" + running);
}, "t2").start();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "get running:" + running);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "get running:" + running);
}, "t3").start();
}
}
вывод на консоль
t1get running:true
t3get running:true
t2change running to:false
t3get running:false
, поэтому поток t1
застревает, а l oop. И я знаю, что если я изменю running
на private static volatile boolean running
, могу это исправить.
Я вопрос, t3
и t2
- разные потоки, почему t3
может получить новое значение running
но t1
не может
EDIT1
@ andrew-tobilko сказал, что это возможно, потому что я вызываю Thread.sleep
в теле l oop, поэтому я измените код t3
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "get running:" + running);
long start = System.nanoTime();
long now = System.nanoTime();
while ((now-start)<3*1000L*1000L*1000L){
now = System.nanoTime();
}
System.out.println(Thread.currentThread().getName() + "get running:" + running);
}, "t3").start();
результат все тот же