假设我有一个包含while循环的线程,我想“从外面”停止它。
public class MyThread extends Thread {
private boolean running = true;
@Override
public void run() {
while (running) {
// do something
}
}
public void setRunning(boolean running) {
this.running = running;
}
}
这是Main class:
public class Main {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
// do something
mt.setRunning(false);
}
}
似乎正在停止正常,但我已经读过布尔值也应该是不稳定的。为什么?会加快停止吗?
答案 0 :(得分:5)
当并发线程将缓存运行变量时,这意味着它将缓存在线程工作内存中。
Java中的volatile关键字用作Java编译器和Thread的指示符,它不缓存此变量的值并始终从主内存中读取它。因此,如果您想要通过实现共享任何读取和写入操作都是原子的变量,则必须将其声明为volatile变量。
答案 1 :(得分:3)
将立即在主存储器中更新。因此,只要running
更新,并发线程就会立即看到更新后的状态。
更新: - 它可能在您的情况下正常工作,可能是因为您没有多个多线程的数量,或者如果您当时已经在主内存中更新了状态。观察此类行为以设置负载测试的最佳方法(使用Jmeter等工具)。这表明为什么对理论/基本概念有很好的掌握,否则你会在生产环境中遇到这些问题,因为有些项目没有预算/时间表来进行负载测试,这会引起你的不满