Класс Cleaner
public final class Cleaner extends Object
Cleaner управляет набором ссылок на объекты и соответствующими действиями очистки. Действия очистки registered выполняются после того, как очиститель уведомлен, что объект стал «призрачно достижимым». Очиститель использует 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(); } }Действия очистки должны быть готовы к одновременному вызову с другими действиями очистки. Как правило, действия очистки должны выполняться очень быстро и не блокировать. Если действие очистки блокируется, это может замедлить обработку других действий очистки, зарегистрированных в том же очистителе. Все действия очистки, зарегистрированные в очистителе, должны быть взаимосовместимы.
- C момента:
- 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 для обработки объектов, ставших «призрачно достижимыми», и вызова действий очистки. Контекстный загрузчик классов потока устанавливается в system class loader. У потока нет разрешений, принудительно только если SecurityManager is set.
Очиститель завершается, когда он становится «призрачно достижимым» и все зарегистрированные действия очистки завершены.
- Возвращает:
- новый
Cleaner - Исключения:
-
SecurityException- если текущему потоку запрещено создавать или запускать поток.
create
public static Cleaner create(ThreadFactory threadFactory)
Cleaner, используя Thread из ThreadFactory. Поток из метода newThread фабрики потоков устанавливается как daemon thread и запускается для обработки объектов, ставших «призрачно достижимыми», и вызова действий очистки. При каждом вызове метод thread factory должен предоставлять поток, подходящий для выполнения действий очистки.
Очиститель завершается, когда он становится «призрачно достижимым» и все зарегистрированные действия очистки завершены.
- Параметры:
-
threadFactory-ThreadFactoryдля возврата новогоThreadдля обработки действий очистки - Возвращает:
- новый
Cleaner - Исключения:
-
IllegalThreadStateException- если поток из фабрики потоков был в состоянииnot a new thread. -
SecurityException- если текущему потоку запрещено создавать или запускать поток.
register
public Cleaner.Cleanable register(Object obj, Runnable action)
- Параметры:
-
obj- контролируемый объект -
action-Runnableдля вызова, когда объект станет «призрачно достижимым» - Возвращает:
- экземпляр
Cleanable
© 1993, 2023, 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/21/docs/api/java.base/java/lang/ref/Cleaner.html