Java ScheduledExecutorService仅使用switch语句执行一次
我有一个对我来说很奇怪的问题。我实现了Java ScheduledExecutorService仅使用switch语句执行一次,java,scheduled-tasks,runnable,scheduledexecutorservice,Java,Scheduled Tasks,Runnable,Scheduledexecutorservice,我有一个对我来说很奇怪的问题。我实现了Runnable,将使用ScheduledExecutorService执行。问题是,它只执行一次 下面是有用的代码(ev是一个枚举): 有趣的是,如果我用一些if-else语句替换这个开关,它工作得很好,这意味着这个Runnable按照我的要求每50毫秒执行一次 private class MenuEventsListener implements Runnable { @Override public void run() {
Runnable
,将使用ScheduledExecutorService
执行。问题是,它只执行一次
下面是有用的代码(ev
是一个枚举):
有趣的是,如果我用一些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,为什么用switch只调用一次
编辑:由于您的提问,以下是MenuEvents和ev的声明:
public enum MenuEvents {
DESIGNER, CONFIG, ABOUT, BACKMENU, EXIT, ENUM_LAST
};
public MenuEvents;
是的,使用
ENUM_LAST
我试图复制C约定,但在那里我也使用它作为一种NULL
值。我没有看到您的完整代码,但我非常确定ev变量在第一次执行Runnable时为NULL
结果,switch语句抛出一个NullPointerException,它将终止线程
在if-else块的情况下,if块或else-if块都不会被执行,并且finally ev被分配了ENUM_LAST的值。我编辑了我的问题以提高精度
public enum MenuEvents {
DESIGNER, CONFIG, ABOUT, BACKMENU, EXIT, ENUM_LAST
};
public MenuEvents;