线程自行停止

时间:2013-10-19 22:00:35

标签: java multithreading

我一直在寻找解决方案很长一段时间,但我找不到一个,所以我会在这里问我的问题。 我有一个线程,它在程序启动时启动,并且在应用程序启用之前应该处于空闲状态。简单的代码示例:

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

2 个答案:

答案 0 :(得分:3)

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

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

我建议使用volatile字段并以10-100毫秒的时间睡眠。但是,更简单的选择是在需要之前不启动线程。

答案 1 :(得分:0)

因为在线程启动时调用了run(),你可以等到程序的后期启动它,线程也不会扩展“Thread”但是实现“Runnable”,所以类定义看起来像: / p>

public class UpdaterThread implements Runnable

希望它有所帮助:D