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上下文永远不会被关闭,而且它是一个记忆泄漏。我怎么能阻止它呢?
注意:我无法更改驱动程序代码。
答案 0 :(得分:1)
Thread.stop
是邪恶的,并且大量弃用,永远不应该被使用。它使线程无法自行清理。在您的情况下,可能永远不会调用Tasker.close
方法,因为线程会立即停止 。您可以通过在Tasker
方法中放入一些日志语句来验证这一点,这些方法在实际发生时打印出来。
最好使用Thread.interrupt
代替,并且该线程中的代码定期检查中断。
如果这是来自你无法控制的调用代码那么你运气不好,因为这样的代码意味着你无法正确控制你的上下文的生命周期。