从Web应用程序创建的线程不会在重新部署时终止

时间:2014-09-19 07:52:26

标签: java multithreading web-applications

我已经看到从Web应用程序创建的Thread在重新部署war文件时不会被杀死。为了测试,我创建了一个ServletContextListener,并通过contextInitialized的方法创建了一个Thread。如果我删除生成Thread的代码并重新部署战争,那么仍在运行。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class RpiServletContextListener implements ServletContextListener {

    public RpiServletContextListener() {

    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        new Thread(() -> {
            while(true) {
                System.out.println("Here------------------");
                try {
                    TimeUnit.SECONDS.sleep(30);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {

    }
}
  • 是什么原因?
  • 如何在应用程序停止时将其终止?

环境:码头

1 个答案:

答案 0 :(得分:0)

你可以有一个标记停止并在你的while循环中引用它。

@WebListener
public class RpiServletContextListener implements ServletContextListener {


    private final AtomicInteger stop = new AtomicInteger(1);

    public RpiServletContextListener() {

    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        new Thread(() -> {
            while(stop.get() <= 1) {
                System.out.println("Here------------------");
                try {
                    TimeUnit.SECONDS.sleep(30);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        this.stop.incrementAndGet();
    }
}