Spec-Zone.ru › OpenJDK 25

Класс Cleaner

java.lang.Object
java.lang.ref.Cleaner
public final class Cleaner extends Object
Cleaner управляет набором ссылок на объекты и соответствующих действий очистки.

Действия очистки регистрируются для выполнения после того, как очиститель получит уведомление о том, что объект стал фантомно достижимым. Очиститель использует PhantomReference и ReferenceQueue, чтобы получать уведомления об изменении достижимости.

Каждый очиститель работает независимо, управляя ожидающими действиями очистки, а также обработкой потоков и завершением работы, когда очиститель больше не используется. Регистрация ссылки на объект и соответствующего действия очистки возвращает Cleanable. Наиболее эффективный способ использования — явно вызвать метод clean, когда объект закрыт или больше не нужен. Действие очистки — это Runnable, которое будет вызвано не более одного раза после того, как объект станет фантомно достижимым, если только очистка уже не была выполнена явно. Обратите внимание: действие очистки не должно ссылаться на регистрируемый объект. В противном случае объект не станет фантомно достижимым, и действие очистки не будет вызвано автоматически.

Действие очистки выполняется потоком, связанным с очистителем. Все исключения, выброшенные действием очистки, игнорируются. Исключения в действии очистки не влияют на очиститель и другие действия очистки. Поток работает, пока не завершатся все зарегистрированные действия очистки и сам очиститель не будет собран сборщиком мусора.

Поведение очистителей во время System.exit зависит от реализации. Гарантии относительно того, будут ли вызваны действия очистки, отсутствуют.

Если не указано иное, передача аргумента null конструктору или методу этого класса приведет к выбрасыванию NullPointerException.

Примечание API:
Действие очистки вызывается только после того, как связанный с ним объект станет фантомно достижимым, поэтому важно, чтобы объект, реализующий действие очистки, не хранил ссылок на этот объект. В этом примере статический класс инкапсулирует состояние и действие очистки. Нельзя использовать «внутренний» класс — анонимный или нет, — поскольку он неявно содержит ссылку на внешний экземпляр, не позволяя ему стать фантомно достижимым. Выбор между созданием нового очистителя и использованием существующего зависит от сценария применения.

Если CleaningExample используется в блоке try-finally, метод close вызывает действие очистки. Если метод close не вызван, действие очистки вызывается Cleaner, когда экземпляр CleaningExample становится фантомно достижимым.

public class CleaningExample implements AutoCloseable {
       // A cleaner (preferably one shared within a library,
       // but for the sake of example, a new one is created here)
       private static final Cleaner cleaner = Cleaner.create();

       // State class captures information necessary for cleanup.
       // It must hold no reference to the instance being cleaned
       // and therefore it is a static inner class in this example.
       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 state;
       private final Cleaner.Cleanable cleanable;

       public CleaningExample() {
           this.state = new State(...);
           this.cleanable = cleaner.register(this, state);
       }

       public void close() {
           cleanable.clean();
       }
   }
Действие очистки может быть лямбда-выражением, но оно легко захватит ссылку на объект при обращении к его полям, не позволяя объекту стать фантомно достижимым. Использование статического вложенного класса, как показано выше, поможет избежать случайного сохранения ссылки на объект.

Действия очистки должны быть готовы к одновременному вызову с другими действиями очистки. Как правило, действия очистки должны выполняться очень быстро и не блокировать работу. Если действие очистки блокируется, это может задержать обработку других действий очистки, зарегистрированных в том же очистителе. Все действия очистки, зарегистрированные в одном очистителе, должны быть взаимно совместимы.

С версии:
9

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static interface  Cleaner.Cleanable
Cleanable представляет объект и действие очистки, зарегистрированные в Cleaner.

Краткое описание методов

Модификатор и тип Метод Описание
static Cleaner create()
Возвращает новый Cleaner.
static Cleaner create(ThreadFactory threadFactory)
Возвращает новый Cleaner, используя Thread из ThreadFactory.
Cleaner.Cleanable register(Object obj, Runnable action)
Регистрирует объект и действие очистки, которое будет выполнено, когда объект станет фантомно достижимым.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

create

public static Cleaner create()
Возвращает новый Cleaner.

Очиститель создает daemon thread для обработки фантомно достижимых объектов и вызова действий очистки. Для потока задается контекстный загрузчик классов системного загрузчика классов.

Очиститель завершает работу, когда он становится фантомно достижимым и все зарегистрированные действия очистки выполнены.

Возвращает:
новый Cleaner

create

public static Cleaner create(ThreadFactory threadFactory)
Возвращает новый Cleaner, используя Thread из ThreadFactory.

Поток, созданный методом newThread фабрики потоков, назначается потоком-демоном и запускается для обработки фантомно достижимых объектов и вызова действий очистки. При каждом вызове фабрика потоков должна предоставлять поток Thread, подходящий для выполнения действий очистки.

Очиститель завершает работу, когда он становится фантомно достижимым и все зарегистрированные действия очистки выполнены.

Параметры:
threadFactory — ThreadFactory, возвращающая новый Thread для обработки действий очистки
Возвращает:
новый Cleaner
Исключения:
IllegalThreadStateException — если поток, полученный от фабрики потоков, не является новым потоком.

register

public Cleaner.Cleanable register(Object obj, Runnable action)
Регистрирует объект и действие очистки, которое будет выполнено, когда объект станет фантомно достижимым. Предупреждения о поведении действий очистки см. в приведенном выше примечании API.

Переданный объект остается сильно достижимым (и поэтому не подлежит очистке) во время выполнения метода register().

Эффекты согласованности памяти: действия в потоке до вызова Cleaner.register() происходят до выполнения действия очистки потоком Cleaner.

Параметры:
obj — отслеживаемый объект
action — Runnable, вызываемый, когда объект становится фантомно достижимым
Возвращает:
экземпляр Cleanable

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, включая концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ref/Cleaner.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API