- 您的
run
方法都依赖于封闭的Foo
类,因此不能独立运行。在那种情况下,我看不到如何执行Foo
gc并保持可运行的“活动”由执行者运行 - 或者您的
run
方法是静态的,因为它不依赖于Foo
类的状态,在这种情况下,您可以将其设为静态,这样可以避免遇到的问题。
您似乎无法处理Runnable中的中断。这意味着即使您调用
future.cancel(true)Runnable也会继续运行,这可能是导致泄漏的原因。
有几种方法可以使可运行的“中断友好的”。您可以调用一个引发InterruptedException的方法(例如
Thread.sleep()IO方法或阻塞IO方法),并且
InterruptedException在取消将来时将引发一个方法。在清除了需要清除的内容并恢复中断状态后,可以捕获该异常并立即退出run方法:
public void run() { while(true) { try { someOperationThatCanBeInterrupted(); } catch (InterruptedException e) { cleanup(); //close files, network connections etc. Thread.currentThread().interrupt(); //restore interrupted status } }}
如果您不调用任何此类方法,则标准习惯用法是:
public void run() { while(!Thread.currentThread().isInterrupted()) { doYourStuff(); } cleanup();}
在这种情况下,您应尝试确保定期检查while条件。
有了这些更改,当您调用时
future.cancel(true),中断信号将被发送到执行您的Runnable的线程,该线程将退出其正在执行的 *** 作,从而使您的Runnable和您的Foo实例有资格使用GC。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)