【问题标题】:Threads created from Web Application are not killed on redeployment从 Web 应用程序创建的线程在重新部署时不会被终止
【发布时间】:2014-09-19 07:52:26
【问题描述】:

我已经看到从 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) {

    }
}
  • 是什么原因?
  • 如何在应用停止时杀死它?

环境:码头

【问题讨论】:

    标签: java multithreading web-applications


    【解决方案1】:

    你可以有一个标志来标记停止并在你的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();
        }
    }
    

    【讨论】:

    • 感谢您的回复。但是为什么线程没有被杀死?
    • @TapasBose 因为您没有编写任何代码来执行此操作,而且 servlet 容器中也没有任何东西可以杀死它们。你应该管理你的东西,包括你创建的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多