Класс 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 |
Регистрирует объект и действие очистки, которое будет выполнено, когда объект станет фантомно достижимым. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, является ли другой объект «равным» этому объекту. |
protected void |
finalize() |
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии. Финализация объявлена устаревшей и может быть удалена в будущем выпуске. |
final Class |
getClass() |
Возвращает класс среды выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка времени. |
Подробное описание методов
create
public static Cleaner create()
Cleaner. Сборщик создаёт daemon thread для обработки фантомно достижимых объектов и вызова действий очистки. Для потока устанавливается загрузчик классов контекста, равный системному загрузчику классов.
Работа сборщика завершается, когда он становится фантомно достижимым и все зарегистрированные действия очистки выполнены.
- Возвращает:
- новый
Cleaner
create
public static Cleaner create(ThreadFactory threadFactory)
Cleaner, используя Thread из ThreadFactory. Поток, полученный методом newThread фабрики потоков, назначается потоком-демоном и запускается для обработки фантомно достижимых объектов и вызова действий очистки. При каждом вызове фабрика потоков должна предоставлять поток, подходящий для выполнения действий очистки.
Работа сборщика завершается, когда он становится фантомно достижимым и все зарегистрированные действия очистки выполнены.
- Параметры:
-
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.