当前位置: 首页 > 知识库问答 >
问题:

只执行一次开关语句

霍襦宗
2023-03-14

我有一个对我来说很奇怪的问题。我实现了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,为什么用switch只调用一次??

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

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

是的,使用ENUM_LAST我试图复制C约定,但在那里我也使用它作为一种NULL值。

共有1个答案

卫振
2023-03-14

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

结果,switch语句抛出一个NullPointerException,它将终止线程。

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

 类似资料:
  • 问题内容: 我正在尝试使用jaxb- maven插件使用JAXB将多个XSD转换为不同包中的POJO。我已将其设置为使用多个执行块,然后执行第一个执行块,然后出现一条消息:模式或绑定文件中未检测到更改 这是我pom.xml的摘录: 这是我收到的错误消息: 如果我交换执行块,则第一个总是执行,其余两个块得到相同的消息。 关于如何解决这个问题的任何想法? 问题答案: 通过升级到版本1.6进行了修复 和

  • 我正在开发一个带有Spring框架和MySQL数据库的J2EE应用程序。我想执行SQL脚本从java(可能与一个请求映射)只有一次。我将sql语句作为键值对存储在属性文件中,并循环遍历每个键并执行语句。 这是正确的做法吗?或者还有其他方法可以做到这一点吗?提前谢谢。 更新: 正如评论中提到的,我尝试了Spring jdbc intiize数据库,但它没有执行sql文件中的所有查询。只有第一个“创建

  • 问题内容: 有人可以解释一下为什么我的循环从0变为7吗?我只需要获得前3种情况,但是程序将遍历所有代码。代码位于show()方法中。 问题答案: 因为没有休息。在每种情况下,您都需要break关键字。有关详细说明,请参见switch语句Java教程。 例如 否则,如果上述情况之一被评估为true,则将执行其他情况。

  • 本文向大家介绍iOS实现代码只执行一次,包括了iOS实现代码只执行一次的使用技巧和注意事项,需要的朋友参考一下 iOS实现代码只让执行一次

  • 我正在学习angularjs,作为一个测试项目,我正在轮询一个返回活动进程列表(它们的pid)并显示这些进程的服务器。 客户端代码如下所示: 这适用于Firefox和Chrome,但不太适用于Internet Explorer 11。 所有浏览器每秒都执行ReloadData方法,但IE11实际上并不从服务器获取流程数据。Firefox和Chrome确实每秒都会获取数据。我也可以在服务器的输出中看

  • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?