Module  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实例变为幻像可访问时,Cleaner会调用清理操作。

       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​()
        返回一个新的Cleaner

        清洁器创建一个daemon thread来处理幻像可到达对象并调用清理操作。 context class loader线程设置为system class loader 线程没有权限,只有在一个SecurityManager is set执行。

        当幻影可到达并且所有注册的清洁操作都完成时,清洁程序将终止。

        结果
        一个新的 Cleaner
        异常
        SecurityException - 如果当前线程不允许创建或启动线程。
      • create

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

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

        当幻影可到达并且所有注册的清洁操作都完成时,清洁程序将终止。

        参数
        threadFactory - a 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