我一直在寻找解决方案很长一段时间,但我找不到一个,所以我会在这里问我的问题。 我有一个线程,它在程序启动时启动,并且在应用程序启用之前应该处于空闲状态。简单的代码示例:
private class UpdaterThread extends Thread {
private static final int UPDATE_RATE = 50;
private Timer updateTimer = new Timer();
private boolean enabled;
public void run() {
while (!closeRequested) {
// If this is uncommented, the thread works as it's supposed to.
// System.out.print("");
if (enabled) {
Snapshot next = getNextSnapshot(1f / UPDATE_RATE);
System.out.println("Got next Snapshot");
updateTimer.sync(UPDATE_RATE);
System.out.println("Push");
currentSnapshot = next;
}
}
}
public void enable() {
enabled = true;
}
public void disable() {
enabled = false;
}
}
答案 0 :(得分:3)
当您读取JIT认为您未修改的变量时,它会内联该值。如果您稍后修改该值,则为时已晚,该值已嵌入代码中。
避免这种情况的一种简单方法是使用volatile
但是你仍然会遇到问题,而不是线程正在忙着等待值改变,并且似乎没有充分的理由这样做。另一种选择是添加混淆JIT的代码,它不会进行此优化。一个空的同步块就足够了,但更友好的方法是使用Thread.sleep(),它至少不会耗尽你所有的CPU。
我建议使用volatile
字段并以10-100毫秒的时间睡眠。但是,更简单的选择是在需要之前不启动线程。
答案 1 :(得分:0)
因为在线程启动时调用了run(),你可以等到程序的后期启动它,线程也不会扩展“Thread”但是实现“Runnable”,所以类定义看起来像: / p>
public class UpdaterThread implements Runnable
希望它有所帮助:D