- 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实例变为幻像可访问时,Cleaner会调用清理操作。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
-
-
Nested Class Summary
Nested Classes Modifier and Type Class 描述 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
必须提供适合执行清洁操作的线程。当幻影可到达并且所有注册的清洁操作都完成时,清洁程序将终止。
- 参数
-
threadFactory
- aThreadFactory
返回新的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
-
-