Класс 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 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 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 для обработки объектов, ставших доступными только через слабую ссылку, и для вызова действий очистки. Контекстный класс загрузчик потока устанавливается в 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, 2021, 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/17/docs/api/java.base/java/lang/ref/Cleaner.html