繁体   English   中英

ScheduledExecutorService仅使用switch语句执行一次

[英]ScheduledExecutorService executed only once with a switch statement

我有一个对我来说很奇怪的问题。 我实现了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);

为什么使用if-else语句每隔50ms调用一次Runnable,以及为什么只用一次开关调用一次Runnable?

编辑:因为您询问,这是MenuEvents和ev的声明:

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

是的,我正在尝试使用ENUM_LAST重现C约定,但在那里我也将其用作一种NULL值。

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

结果,switch语句将引发NullPointerException,这将杀死您的线程。

在if-else块的情况下,不会执行if块或else if块,并且最终ev不会分配ENUM_LAST的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM