Java Eclipse:ScheduledExecutorService.scheduleWithFixedDelay不会在发布时删除
我有个奇怪的问题 我有一个ScheduledExecutorService.scheduleWithFixedDelay,当我单击发布/停止重新启动服务器时,它不会“停止” 当我重新发布时,将有2个服务正在运行,运行相同服务的次数取决于我单击发布的次数 在我停止并启动服务器之后,这不会消失 我必须关闭eclipse并打开以停止它,我注意到只有在编辑初始化服务的类之后才会发生这种情况 我无法粘贴代码,但非常简单。。只有一个单身汉,并持有服务Java Eclipse:ScheduledExecutorService.scheduleWithFixedDelay不会在发布时删除,java,eclipse,Java,Eclipse,我有个奇怪的问题 我有一个ScheduledExecutorService.scheduleWithFixedDelay,当我单击发布/停止重新启动服务器时,它不会“停止” 当我重新发布时,将有2个服务正在运行,运行相同服务的次数取决于我单击发布的次数 在我停止并启动服务器之后,这不会消失 我必须关闭eclipse并打开以停止它,我注意到只有在编辑初始化服务的类之后才会发生这种情况 我无法粘贴代码,但非常简单。。只有一个单身汉,并持有服务 private final ScheduledExecu
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() { system.out("hello" }
}, 60 * 60, SECONDS);
我似乎找不到问题所在,有人能帮我吗。当应用程序取消部署时,您应该关闭计划程序。更简单的方法是声明一个实现a,并在
contextdestromed()
方法中关闭调度程序。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在程序完成时退出您的部署过程一定有问题。停止和启动服务器必须始终停止服务,除非您的部署过程在每次单击“发布”时多次发布应用程序。这只能在知道安装(内部/外部启动,Tomcat/JBase.YUP)时进行调试。我确实考虑过这一点,但我不明白为什么我需要这么做,因为我个人觉得API应该能够处理它。容器怎么会知道你产生了线程?我是说ScheduledExecutorService。。。这是唯一的解决办法吗?下面的解决方案会起作用吗?同样的事情:ScheduledExecutorService是一个实用类,它根本没有连接到JEE和webapps。它不知道它在网络应用程序中使用,也不知道网络应用程序何时被销毁。因此,提供一个线程工厂来创建守护进程线程,或者在应用程序被销毁时关闭服务。确保守护进程线程仅在JVM退出时停止运行。当应用程序被重新部署时就不会了。这是你必须做的。但我宁愿问自己:在一个应用程序中有许多调度器是正常的吗?打开就足够了吗?我更喜欢设置守护进程解决方案,但是有什么我应该注意的吗?当我重新发布时线程会停止吗?