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
代替,并让该线程中的代码定期检查中断。
如果这是来自无法控制的代码调用,那么您就不走运了,因为这样的代码意味着您无法正确控制上下文的生命周期。