【发布时间】:2021-08-13 10:43:47
【问题描述】:
我有以下课程:
public class ThreadStopTest {
private static boolean enabled = true;
private static int milliseconds = 5;
public static void main(String[] args) {
new Thread(ThreadStopTest::process).start();
sleepMillSeconds(milliseconds);
disableProcessing();
}
private static void disableProcessing() {
enabled = false;
System.err.println("Processing disable called");
}
private static boolean isEnabled() {
return enabled;
}
private static void process() {
boolean printed = false;
while (isEnabled()) {
if(!printed) {
System.err.println("Processing started");
printed = true;
}
}
System.err.println("Processing finished");
}
private static void sleepMillSeconds(int mills) {
try {
Thread.sleep(mills);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
如果毫秒> 5,则此类执行挂起并且永不停止, 但如果毫秒
在 enabled 参数中添加 volatile 修饰符可以解决问题,但我想知道这种奇怪行为的原因是什么。有人有想法吗?
【问题讨论】:
-
如果您有一个长时间运行或阻塞的方法,有时使用标准的 java 方法来停止执行可能是合理的 - 声明该方法抛出 InterruptedException 并检查 Thread.currentThread().isInterrupted( ) 在你的循环中抛出一个 InterruptedException,而不是检查像你的 isEnabled 这样的合成值。
标签: java multithreading