- java.lang.Object
-
- java.lang.ref.Cleaner
-
public final class Cleaner extends Object
Cleaner
管理一组对象引用和相应的清理操作。在清洁工被通知对象已变为幻像可达之后,清洁操作是
registered
。 当reachability更改时,清洁器使用PhantomReference
和ReferenceQueue
通知。每个清洁器独立运行,管理待处理的清洁操作,并在清洁器不再使用时处理螺纹和终止。 注册对象引用和相应的清理操作将返回
Cleanable
。 最有效的用法是在对象关闭或不再需要时显式调用clean
方法。 清除操作是Runnable
,当对象变为幻像可访问时,最多只调用一次,除非已经明确清除。 请注意,清除操作不得引用正在注册的对象。 如果是这样,对象将不会变为幻像,并且不会自动调用清理操作。清洁动作的执行由与清洁器相关联的线程执行。 清除操作引发的所有异常都将被忽略。 清洁和其他清洁操作不受清洁操作中的例外影响。 该线程一直运行,直到所有已注册的清洁操作都已完成,并且清理器本身由垃圾收集器回收。
System.exit
期间清洁工的行为是特定于实施的。 不保证是否调用清洁行动。除非另有说明,否则将
null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
。- API Note:
-
仅在关联对象变为幻像可访问之后才调用清理操作,因此实现清理操作的对象不保留对该对象的引用非常重要。
在此示例中,静态类封装了清理状态和操作。
必须不使用“内部”类(匿名或非匿名),因为它隐式包含对外部实例的引用,从而防止它变为幻像可达。
选择新的清洁剂或共享现有的清洁剂由用例决定。
如果在try-finally块中使用CleaningExample,则
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(); } }
应准备好清洁措施,以便与其他清洁措施同时使用。 通常,清洁操作应该非常快速地执行而不是阻塞。 如果清洁动作阻塞,则可能延迟处理注册到同一清洁器的其他清洁动作。 注册到清洁剂的所有清洁操作应相互兼容。
- 从以下版本开始:
- 9
-
-
嵌套类汇总
嵌套类 变量和类型 类 描述 static interface
Cleaner.Cleanable
Cleanable
表示在Cleaner
注册的对象和清洁操作。
-
-
-
方法详细信息
-
create
public static Cleaner create()
返回一个新的Cleaner
。清理器创建一个
daemon thread
来处理幻像可访问对象并调用清理操作。 该context class loader线程设置为system class loader
。 该线程没有权限,仅在SecurityManager is set
时强制执行。清洁器在幻像可达时终止,并且所有已注册的清洁操作都已完成。
- 结果
-
一个新的
Cleaner
- 异常
-
SecurityException
- 如果不允许当前线程创建或启动线程。
-
create
public static Cleaner create(ThreadFactory threadFactory)
返回一个新Cleaner
使用Thread
从ThreadFactory
。来自线程工厂的
newThread
方法的线程设置为daemon thread
,并开始处理幻像可访问对象并调用清理操作。 在每次调用时,thread factory
必须提供适合执行清理操作的Thread。清洁器在幻像可达时终止,并且所有已注册的清洁操作都已完成。
- 参数
-
threadFactory
-ThreadFactory
返回新的Thread
以处理清洁操作 - 结果
-
一个新的
Cleaner
- 异常
-
IllegalThreadStateException
- 如果线程工厂的线程是not a new thread
。 -
SecurityException
- 如果不允许当前线程创建或启动线程。
-
register
public Cleaner.Cleanable register(Object obj, Runnable action)
注册对象和清理操作,以便在对象变为幻像可访问时运行。 有关清洁操作行为的注意事项,请参阅上面的API Note 。- 参数
-
obj
- 要监视的对象 -
action
- 一个Runnable
,当对象变为幻像可达时调用 - 结果
-
a
Cleanable
instance
-
-