1

我遇到了奇怪的问题。

我有一个 ScheduledExecutorService.scheduleWithFixedDelay 当我单击发布/停止重新启动服务器时它不会“停止”。

当我重新发布时,将运行 2 个服务,并且运行相同服务的数量取决于我单击发布的次数。

在我停止并启动服务器后,这并没有消失。

我必须关闭 eclipse 并打开它才能停止它,我注意到只有在我编辑初始化服务的类之后才会发生这种情况。

我无法粘贴代码,但很简单.. 只是一个单例并持有服务

private final ScheduledExecutorService scheduler = 
       Executors.newScheduledThreadPool(1);

scheduler.scheduleAtFixedRate(new Runnable() {
                public void run() { system.out("hello" }
            }, 60 * 60, SECONDS);

我似乎无法找出问题所在,请有人帮助我。

4

2 回答 2

2

您应该在取消部署应用程序时关闭调度程序。更简单的方法是声明一个实现ServletContextListener,并在方法中关闭调度程序contextDestroyed()

于 2013-02-20T09:51:54.513 回答
1

Executors.newScheduledThreadPool(1); 创建一个非守护进程工作线程,它会阻止 JVM 关闭,除非您明确关闭调度程序

scheduler.shutdown();

或者,您可以执行以下操作

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1,
            new ThreadFactory() {
                public Thread newThread(Runnable r) {
                    Thread t = new Thread(r);
                    t.setDaemon(false);
                    return t;
                }

            });

在这种情况下,工作线程将是一个守护进程,并且不会阻止 JVM 在程序完成时退出

于 2013-02-20T10:12:34.227 回答