预定的将来会导致内存泄漏吗?

预定的将来会导致内存泄漏吗?,第1张

预定的将来会导致内存泄漏吗?
  • 您的
    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。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5501360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存