[英]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.