java - 如何获取线程引用以在 contextDestroyed 方法中停止它

标签 java multithreading tomcat6

我的应用程序服务器日志中有错误

SEVERE: A web application appears to have started a thread named [MyThread] but has failed to stop it. This is very likely to create a memory leak.

要解决这个问题,我应该在我的 ServletContextListener 实现的 contextDestroyed 方法中停止线程。

但我无法理解如何获取我的 Thread/Runnable 的引用,以便我可以调用 interrupt()。

我的一个解决方案是:将此线程实例放在 ServletContext 属性中,但不确定它是否是好的做法。 如果您在申请中采用其他方法,请提出建议。

最佳答案

在我的应用程序中有一个服务类(MyServiceClass)

  1. 加载配置文件
  2. 验证数据库连接
  3. 初始化这个线程

在应用程序开始时,它的 isConfigurationValid() 方法从 ServletContextListener 调用,该方法执行以上 3 个操作。

这个类有一个 Thread 类型的实例变量,它在其私有(private)的 initializeThread 方法中被分配了 Thread 对象。此方法使用双重检查习惯用法来确保只创建一个 Runnable 对象。

现在我已经为我的线程实例字段提供了一个静态 getter 方法,我在 contextDestroyed 方法中使用它来中断我的线程。 以下为原始代码,如有语法错误请忽略

MyServiceClass {

    Thread thread;

    public static boolean isConfigurationValid(){
        loadConfigFile(); // private method of same class
        validateDBConfiguration();// private method of same class
        initializeThread();// private method of same class
    }

    private static void initializeThread (boolean usePrimaryPort) {
        {
            if (thread == null){
                synchronized (MyServiceClass.class){
                    if (thread == null){
                        Thread thread = new Thread();
                        Thread.start();
                    }
                }
            }
            return;
        }
    }
    public static Thread getThread(){
        return thread;
    }
}

关于java - 如何获取线程引用以在 contextDestroyed 方法中停止它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22095983/

相关文章:

tomcat - 在同一 tomcat 但不同端口上部署 Web 服务和 Web 门户时的 JVM

java - log4j: Tomcat 6 错误

java - 通过java锁定数组中的每个项目

Java:是否可以将 Class<?> 对象与泛型类型参数进行比较?

multithreading - 线程计算OCaml

java - Tomcat 6 - 如何配置 Digest SHA-256

java - 为什么 JPA\Hibernate 不自动创建这个映射字段?

java - NetLogo 的安全问题

ios - 如何在后台线程中准备UI?

用于带有 GSM 调制解调器 rxtx 的 IVRS 的 Java 多线程(播放语音文件使事件监听器停止工作)