0

我有一堂课,例如:

public class Test {

    private static Thread aThread;
    private static Loopy aLoop;

    public Test() {
    }

    public static void main(String[] args) {

        startUpdate();
        stopUpdate();
        startUpdate();

    }

    public static void startUpdate() {

        aLoop = new Loopy();
        aThread = new Thread(aLoop);

        aThread.start();

    }

    public static void stopUpdate() {

        if (aThread != null) {
            aLoop.finish();
        }
    }
}

具有如下所示的可运行代码:

public class Loopy implements Runnable {

    private static String status = "R";       // Run

    public void run() {

        while (status.equals("R")) {
            // Do Stuff
        }
    }

    public void finish() {
        status = "F";                         // End Run
    }
}

第一次调用 startUpdate 有效。

StopUpdate 按计划工作。

第二次调用 startUpdate 导致没有工作完成,因为状态仍然等于“F”,即使我正在启动一个新的 Loopy 实例(对我来说)应该具有默认值“R”。

状态是跨实例持续存在,还是我犯了一个我还没有发现的错误?

4

2 回答 2

5

你过度使用了static.

在您的Loopy班级中,它String status是并且因此在所有实例static中共享。Loopy

您应该status通过删除static.

另一个注意事项是,它的状态status也应该被许多线程更改而没有同步。volatile

我还建议您也许也应该在Test实例中创建所有变量/方法(除了main),因为通常最好static在可能的情况下避免:

public class Test {

    private Thread aThread;
    private Loopy aLoop;

    public static void main(String[] args) {
        final Test test = new Test();
        test.startUpdate();
        test.stopUpdate();
        test.startUpdate();

    }

    public void startUpdate() {
        aLoop = new Loopy();
        aThread = new Thread(aLoop);
        aThread.start();
    }

    public void stopUpdate() {
        if (aThread != null) {
            aLoop.finish();
        }
    }
}
于 2013-10-04T13:29:17.293 回答
0

我认为状态不应该是静态的

于 2013-10-04T13:30:53.673 回答