gpt4 book ai didi

带有 Jersey 和 Tomcat 的 Java Web 服务。 ¿如何在 Web 服务停止时停止所有线程?

转载 作者:行者123 更新时间:2023-11-28 23:40:59 25 4
gpt4 key购买 nike

我需要某种帮助以了解解决此问题的方法。

我有一个在 tomcat 服务器中使用 jersey 的 java 网络服务。我的 Java 代码为某些任务启动了一些线程。一切正常。问题是,当在 tomcat 服务器的管理器面板上停止 web 服务时,线程继续执行。

当用户按下 tomcat 服务器管理器面板上的停止按钮时,是否存在一种停止这种 java jersey web 服务的所有线程的方法?

谢谢

PD:我知道在 java 中存在一个用于线程的 interrupt() 函数,但我不知道当用户按下服务器管理器面板中的停止按钮时如何启动该函数。

最佳答案

您可以尝试将线程设置为守护模式。您可以使用 Thread 中的方法 setDaemon() 来执行此操作。当唯一运行的线程都是守护线程时,Java 虚拟机退出。可能是您创建的线程是用户线程,因此 JVM 不会退出。

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setDaemon(boolean)

我确实有没有明确执行此操作的软件,但我没有遇到这个问题,所以可能是您的线程不知道它们应该停止运行的情况。您可以通过某种控制标志来解决此问题,让您的线程知道它们现在可以停止。使用 AtomicBoolean 对此效果很好。如果您使用的是 Tomcat,您可以创建一个 servlet 作为您的主根来启动和控制您的线程。 Tomcat promise 在关闭时运行您的 servlet 的 destroy() 方法,这可以正确地停止您的线程运行。这是一个基本的例子。

@WebServlet(urlPatterns = {"/checkStatus"}, loadOnStartup = 1)
public class ThreadController extends HttpServlet {

private AtomicBoolean running = new AtomicBoolean(false);
private Thread myThread = new Thread() {

@Override
public void run() {
while (running.get()) {
//do stuff
}
}

};

@Override
public void destroy() {
running.set(false);
myThread.interrupt();
}

@Override
public void init() throws ServletException {
running.set(true);
myThread.start();
}

}

虽然在我的实现中我使用 Executors 来启动和中断我的线程,但您可以自己进一步查看。

另一种选择是使用 ScheduledExecutorService。

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private ScheduledFuture<?> cleanUpHandle;


@Override
public void init() {
cleanUpHandle = scheduler.scheduleAtFixedRate(cleanUp, 60, 60, TimeUnit.SECONDS);
}

@Override
public void destroy() {
cleanUpHandle.cancel(true);
}

在我上面的示例中,cleanUp 是一个 Thread 实现。使用调度程序的好处是您不需要在线程的运行方法中使用 while 循环控制。 run 方法只执行其任务的一次迭代并结束。

这些只是您可以尝试的几件事,正确的解决方案将基于您要实现的目标。

关于带有 Jersey 和 Tomcat 的 Java Web 服务。 ¿如何在 Web 服务停止时停止所有线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com