首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Jersey和Tomcat的Java Web服务。[如何在停止web服务时停止所有线程?

使用Jersey和Tomcat的Java Web服务。[如何在停止web服务时停止所有线程?
EN

Stack Overflow用户
提问于 2013-10-30 00:41:02
回答 2查看 1.8K关注 0票数 0

我需要一些帮助来找出解决这个问题的方法。

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

当用户按下tomcat服务器管理器面板上的停止按钮时,有没有一种方法可以停止这种java jersey webservice的所有线程?

谢谢

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

EN

回答 2

Stack Overflow用户

发布于 2013-10-30 01:23:42

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

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

我确实有软件不显式地做到这一点,但我没有这个问题,所以它可能是你的线程不知道他们应该停止运行的情况。你可以通过设置某种控制标志来修复这个问题,让你的线程知道它们现在可以停止了。使用AtomicBoolean可以很好地做到这一点。如果您使用的是Tomcat,则可以创建一个servlet作为启动和控制线程的主根。Tomcat承诺在关闭时运行servlet的servlet()方法,这可以正确地停止线程的运行。这是一个基本的例子。

代码语言:javascript
复制
@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();
}

}

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

另一种选择是使用ScheduledExecutorService。

代码语言:javascript
复制
 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是一个线程实现。使用调度器的好处是,在线程的run方法中不需要控制while循环。run方法只执行其任务的一次迭代并完成。

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

票数 0
EN

Stack Overflow用户

发布于 2013-10-30 01:39:07

使用Web service context listener WSServletContextListener并在您的web.xml中配置它,然后在contextDestroyed方法中编写停止所有线程的逻辑。在Tomcat管理器中单击“停止”会将ServletContextEvent事件发送到

代码语言:javascript
复制
public void contextDestroyed(ServletContextEvent event)

在这里,您可以劫持事件,杀死所有线程并释放所有资源,这是停止线程的最佳位置。您的web.xml应该添加侦听器,如下所示。例如:

代码语言:javascript
复制
      <listener>
//Fully qualified listener class name implementing javax.servlet.ServletContextListener
       <listener-class>XXX.XXX.XXX.YourListenerClass</listener-class>
     </listener>

希望这能给我们一个启发!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19664211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档