0

我一直在寻找解决方案很长时间,但我无法找到一个解决方案,所以我将在这里提出我的问题。我有一个线程,它在程序启动时启动并且应该是空闲的,直到它被应用程序启用。简单的代码示例:

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;
    }
}
4

2 回答 2

3

当您读取 JIT 认为您没有修改的变量时,它会将值内联。如果您稍后再修改该值,则为时已晚,该值已嵌入代码中。

避免这种情况的一种简单方法是使用volatile,但您仍然会遇到问题,因为线程正忙于等待值更改,并且似乎没有充分的理由这样做。另一种选择是添加混淆 JIT 的代码,它不会进行此优化。一个空的同步块就足够了,但更友好的方法是使用 Thread.sleep() 至少不会耗尽所有 CPU。

我建议使用一个volatile字段并以 10-100 毫秒的周期休眠。然而,一个更简单的选择是在需要之前不启动线程。

于 2013-10-19T22:05:50.500 回答
0

由于 run() 在线程启动时被调用,您可以等到程序稍后再启动它,线程也不扩展“线程”但实现“可运行”,因此类定义如下所示:

public class UpdaterThread implements Runnable

希望它有所帮助:D

于 2013-10-19T22:09:25.483 回答