public class Tasker{
    ConfigurableApplicationContext context  ;

    public void load(){
          context = = loadSpringContext();
    }

    pulic void doSomething(){
      //do something
    }

    public  void close(){
       context.close();
    }
}


public class Caller extends Thread {

  public void run(){
    Tasker tasker = new Tasker();
       try{
         tasker.load();
         tasker.doSomething();
       }finally(){
         tasket.close();
       }
  }

}

//sample driver code which is not in my control
Caller caller = new Caller()
caller.start();
caller.stop();


现在的问题是,如果somone调用杀死线程,则我的Spring上下文永远不会关闭,并且会导致内存泄漏。我该如何预防呢?

注意:我无法更改驱动程序代码。

最佳答案

Thread.stop是邪恶的,已被严重弃用,永远不要使用。它使线程没有机会自行清理。在您的情况下,很可能从未调用Tasker.close方法,因为Thread立即停止。您可以通过在某些实际发生情况时打印出的Tasker方法中放入一些日志语句来验证这一点。

最好使用Thread.interrupt代替,并让该线程中的代码定期检查中断。

如果这是来自无法控制的代码调用,那么您就不走运了,因为这样的代码意味着您无法正确控制上下文的生命周期。

10-06 00:38