2

我有一个对我来说很奇怪的问题。我实现了Runnable, 来执行ScheduledExecutorService。问题是,它只执行一次......

这是有用的代码(ev是一个枚举):

private class MenuEventsListener implements Runnable    {
    @Override
    public void run() {
        System.out.println("Next iteration...");
        switch(ev)  {
            case DESIGNER:
                foo();
            break;
            case EXIT:
                dispose();
                System.exit(0);
            break;
        }
        ev = MenuEvents.ENUM_LAST;  
    }
}

有趣的是,如果我用一些 if-else 语句替换那个开关,它工作正常,这意味着这个 Runnable 按照我的要求每 50 毫秒执行一次......!

private class MenuEventsListener implements Runnable    {
    @Override
    public void run() {
        System.out.println("Next iteration...");
        if (ev == MenuEvents.DESIGNER)
            foo();
        else if (ev == MenuEvents.EXIT) {
            dispose();
            System.exit(0);
        }
        ev = MenuEvents.ENUM_LAST;      
    }
}

这是调度设置:

    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new MenuEventsListener(), 
            0, 50, TimeUnit.MILLISECONDS);

为什么 Runnable 每 50ms 用 if-else 语句调用一次,为什么只用 switch 调用一次?

编辑:因为你问,这里是 MenuEvents 和 ev 的声明:

public enum MenuEvents  { 
    DESIGNER, CONFIG, ABOUT, BACKMENU, EXIT, ENUM_LAST
};
public MenuEvents;

是的,ENUM_LAST我试图重现 C 约定,但在那里我也将它用作一种NULL价值。

4

1 回答 1

3

I don't see your full code but I am pretty sure that the ev variable is null the first time that you Runnable is executed.

As a result, the switch statement throws a NullPointerException which kills your thread.

In the case of the if-else block, neither the if block or the else if blocks are executed and finally ev is assigned the value of ENUM_LAST.

于 2014-06-29T16:08:48.860 回答