Класс Cleaner

public final class Cleaner
extends Object

Cleaner управляет набором ссылок на объекты и соответствующими действиями по очистке.

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

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

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

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

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

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

Если CleaningExample используется в блоке try-finally, то метод close вызывает действие по очистке. Если метод close не вызывается, действие по очистке вызывается очистителем, когда экземпляр 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;
        private final Cleaner.Cleanable cleanable

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

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

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

Since:
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)

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

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

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

Методы

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)

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

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

© 1993, 2020, 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/11/docs/api/java.base/java/lang/ref/Cleaner.html

Spec-Zone .ru
спецификации, руководства, описания, API