【问题标题】:ScheduledExecutorService executed only once with a switch statementScheduledExecutorService 仅使用 switch 语句执行一次
【发布时间】:2014-08-19 22:32:30
【问题描述】:

我有一个对我来说很奇怪的问题。我实现了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 语句替换那个 switch,它工作正常,这意味着这个 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 的一种值。

【问题讨论】:

  • 我编辑了我的问题以提供一些精确度

标签: java scheduled-tasks runnable scheduledexecutorservice


【解决方案1】:

我没有看到您的完整代码,但我很确定第一次执行 Runnable 时 ev 变量为空。

因此,switch 语句会引发 NullPointerException,从而杀死您的线程。

在 if-else 块的情况下,既不执行 if 块,也不执行 else if 块,最后为 ev 分配 ENUM_LAST 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多