Класс 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 |
Возвращает новый Cleaner, используя Thread из ThreadFactory. |
Cleaner.Cleanable |
register |
Регистрирует объект и действие очистки, которое будет выполнено, когда объект станет фантомно достижимым. |
Подробное описание методов
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)
Переданный объект остается сильно достижимым (и поэтому не подлежит очистке) во время выполнения метода register().
Эффекты согласованности памяти: действия в потоке до вызова Cleaner.register() происходят до выполнения действия очистки потоком Cleaner.
- Параметры:
-
obj— отслеживаемый объект -
action—Runnable, вызываемый, когда объект становится фантомно достижимым - Возвращает:
- экземпляр
Cleanable
© 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