模块  java.base
软件包  java.lang.ref

Class Cleaner


  • public final class Cleaner
    extends Object
    Cleaner管理一组对象引用和相应的清理操作。

    在清洁工被通知对象已变为幻像可达之后,清洁操作是registered reachability更改时,清洁器使用PhantomReferenceReferenceQueue通知。

    每个清洁器独立运行,管理待处理的清洁操作,并在清洁器不再使用时处理螺纹和终止。 注册对象引用和相应的清理操作将返回Cleanable 最有效的用法是在对象关闭或不再需要时显式调用clean方法。 清除操作是Runnable ,当对象变为幻像可访问时,最多只调用一次,除非已经明确清除。 请注意,清除操作不得引用正在注册的对象。 如果是这样,对象将不会变为幻像,并且不会自动调用清理操作。

    清洁动作的执行由与清洁器相关联的线程执行。 清除操作引发的所有异常都将被忽略。 清洁和其他清洁操作不受清洁操作中的例外影响。 该线程一直运行,直到所有已注册的清洁操作都已完成,并且清理器本身由垃圾收集器回收。

    System.exit期间清洁工的行为是特定于实施的。 不保证是否调用清洁行动。

    除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException

    API Note:
    仅在关联对象变为幻像可访问之后才调用清理操作,因此实现清理操作的对象不保留对该对象的引用非常重要。 在此示例中,静态类封装了清理状态和操作。 必须不使用“内部”类(匿名或非匿名),因为它隐式包含对外部实例的引用,从而防止它变为幻像可达。 选择新的清洁剂或共享现有的清洁剂由用例决定。

    如果在try-finally块中使用CleaningExample,则close方法将调用清理操作。 如果未调用close方法,则当CleaningExample实例变为幻像可访问时,清除程序将调用清理操作。

       public class CleaningExample implements AutoCloseable { // A cleaner, preferably one shared within a library private static final Cleaner cleaner = <cleaner>; static class State implements Runnable { State(...) { // initialize State needed for cleaning action } public void run() { // cleanup action accessing State, executed at most once } } private final State; private final Cleaner.Cleanable cleanable public CleaningExample() { this.state = new State(...); this.cleanable = cleaner.register(this, state); } public void close() { cleanable.clean(); } }  
    清理动作可以是lambda,但是通过引用被清理对象的字段,可以很容易地捕获对象引用,从而防止对象变为幻像可达。 如上所述,使用静态嵌套类将避免意外保留对象引用。

    应准备好清洁措施,以便与其他清洁措施同时使用。 通常,清洁操作应该非常快速地执行而不是阻塞。 如果清洁动作阻塞,则可能延迟处理注册到同一清洁器的其他清洁动作。 注册到清洁剂的所有清洁操作应相互兼容。

    从以下版本开始:
    9
    • 方法详细信息

      • create

        public static Cleaner create​(ThreadFactory threadFactory)
        返回一个新Cleaner使用ThreadThreadFactory

        来自线程工厂的newThread方法的线程设置为daemon thread并开始处理幻像可访问对象并调用清理操作。 在每次调用时, thread factory必须提供适合执行清理操作的Thread。

        清洁器在幻像可达时终止,并且所有已注册的清洁操作都已完成。

        参数
        threadFactory - ThreadFactory返回新的 Thread以处理清洁操作
        结果
        一个新的 Cleaner
        异常
        IllegalThreadStateException - 如果线程工厂的线程是 not a new thread
        SecurityException - 如果不允许当前线程创建或启动线程。
      • register

        public Cleaner.Cleanable register​(Object obj,
                                          Runnable action)
        注册对象和清理操作,以便在对象变为幻像可访问时运行。 有关清洁操作行为的注意事项,请参阅上面的API Note
        参数
        obj - 要监视的对象
        action - 一个 Runnable ,当对象变为幻像可达时调用
        结果
        a Cleanable instance