Класс Cleaner
public final class Cleaner extends Object
Cleaner управляет набором ссылок на объекты и соответствующими действиями очистки. Действия очистки регистрируются для выполнения после того, как очиститель получит уведомление о том, что объект стал доступным для фантомной ссылки. Очиститель использует PhantomReference и ReferenceQueue для получения уведомлений о изменениях доступности.
Каждый очиститель работает независимо, управляя ожидающими действиями очистки и обрабатывая потоки и завершение, когда очиститель больше не используется. Регистрация ссылки на объект и соответствующего действия очистки возвращает Cleanable. Наиболее эффективным использованием является явное вызов метода clean, когда объект закрыт или больше не нужен. Действие очистки — это Runnable, которое вызывается не более одного раза, когда объект становится доступным для фантомной ссылки, если оно не было уже явно вызвано. Обратите внимание, что действие очистки не должно ссылаться на регистрируемый объект. В противном случае объект не станет доступным для фантомной ссылки, и действие очистки не будет вызвано автоматически.
Выполнение действия очистки выполняется потоком, связанным с очистителем. Все исключения, сгенерированные действием очистки, игнорируются. Очиститель и другие действия очистки не затрагиваются исключениями в действии очистки. Поток работает до тех пор, пока все зарегистрированные действия очистки не будут завершены, и сам очиститель не будет передан сборщику мусора.
Поведение очистителей во время System.exit зависит от реализации. Не гарантируется, что действия очистки будут вызваны или нет.
Если не указано иное, передача null аргумента конструктору или методу в этом классе вызовет NullPointerException.
- Примечание API:
- Действие очистки вызывается только после того, как связанный объект становится доступным для фантомной ссылки, поэтому важно, чтобы объект, реализующий действие очистки, не хранил ссылки на объект. В этом примере статический класс инкапсулирует состояние и действие очистки. Вложенный класс, анонимный или нет, не должен использоваться, так как он неявно содержит ссылку на внешний экземпляр, препятствуя его превращению в фантомную ссылку. Выбор нового очистителя или совместного использования существующего очистителя определяется сценарием использования.
Если CleaningExample используется в блоке try-finally, то метод
closeвызывает действие очистки. Если методcloseне вызывается, действие очистки вызывается очистителем, когда экземпляр 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 фабрики потоков устанавливается как поток-демoн и запускается для обработки объектов, доступных для фантомной ссылки, и вызова действий очистки. При каждом вызове фабрика потоков должна предоставить поток, подходящий для выполнения действий очистки.
Очиститель завершается, когда он становится доступным для фантомной ссылки и все зарегистрированные действия очистки завершены.
- Параметры:
-
threadFactory-ThreadFactory, возвращающий новыйThreadдля обработки действий очистки - Возвращает:
- новый
Cleaner - Исключение:
-
IllegalThreadStateException- если поток из фабрики потоков не был новым потоком.
register
public Cleaner.Cleanable register(Object obj, Runnable action)
Данный объект сохраняется с сильной ссылкой (и, следовательно, не подлежит очистке) во время метода register().
Влияние согласованности памяти: Действия в потоке до вызова Cleaner.register() предшествуют запуску действия очистки потоком очистителя.
- Параметры:
-
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/ref/Cleaner.html