Cleaner
は、一連のオブジェクト参照と対応するクリーニング・アクションを管理します。
クリーナは、オブジェクトが有線で到達可能になったことがクリーナに通知された後で実行するために、クリーニング動作はregistered
です。 クリーナは、PhantomReference
とReferenceQueue
を使用して、reachabilityが変更されたときに通知を受け取ります。
各クリーナは、独立して動作し、保留中のクリーニング動作を管理し、クリーナがすでに使用されていないときにスレッドおよび終了を処理します。 オブジェクト参照と対応するクリーニング・アクションを登録すると、Cleanable
が返されます。 最も効率的な使用法は、オブジェクトが閉じられたり不要になったときに、clean
メソッドを明示的に呼び出すことです。 クリーニング・アクションは、すでに明示的にクリーニングされていない限り、オブジェクトがファントム到達可能になったときに呼び出されるRunnable
です。 クリーニング動作は、登録されているオブジェクトを参照してはならないことに注意してください。 そうであれば、オブジェクトは想像を絶するものにならず、クリーニング動作は自動的に呼び出されません。
クリーニング・アクションの実行は、クリーナに関連するスレッドによって実行されます。 クリーニング・アクションによってスローされたすべての例外は無視されます。 クリーナおよびその他のクリーニング・アクションは、クリーニング・アクションの例外の影響を受けません。 スレッドは、登録されているすべてのクリーニング処理が完了し、クリーナ自体がガベージ・コレクタによって再利用されるまで実行されます。
System.exit
中のクリーナの動作は実装固有です。 クリーニング動作の呼び出しの有無は保証されていません。
ほかで指定がない場合、null
引数をコンストラクタまたはこのクラスのメソッドへ渡すと、NullPointerException
がスローされます。
- APIのノート:
- クリーニング・アクションは、関連付けられたオブジェクトにファントム到達可能になった後にのみ呼び出されるため、クリーニング・アクションを実装するオブジェクトにオブジェクトへの参照が保持されていないことが重要です。 この例では、静的クラスはクリーニング状態とアクションをカプセル化します。 "inner"クラスは、暗黙的に外部インスタンスへの参照を含んでいるため、匿名であるかどうかにかかわらず、使用しないでください。 新しいクリーナの選択または既存のクリーナの共有は、ユースケースによって決まります。
CleaningExampleがtry-finallyブロックで使用されている場合、
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 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 Cleaner
create()
新しいCleaner
を返します。static Cleaner
create
(ThreadFactory threadFactory) ThreadFactory
からThread
を使用して新しいCleaner
を返します。オブジェクトにファントム到達可能になったときに実行するオブジェクトとクリーニング・アクションを登録します。
-
メソッドの詳細
-
create
public static Cleaner create()新しいCleaner
を返します。クリーナは、ファントム到達可能オブジェクトを処理し、クリーニング・アクションを呼び出す
daemon thread
を作成します。 スレッドの「コンテキスト・クラス・ローダー」はsystem class loader
に設定されます。 スレッドはパーミッションを持たず、SecurityManager is set
の場合にのみ実行されます。ファントムに到達し、登録されたすべてのクリーニング動作が完了すると、クリーナは終了します。
- 戻り値:
- 新しい
Cleaner
- 例外:
SecurityException
- 現在のスレッドがスレッドの作成または開始を許可されていない場合。
-
create
public static Cleaner create(ThreadFactory threadFactory) ThreadFactory
からThread
を使用して新しいCleaner
を返します。スレッド・ファクトリの
newThread
メソッドからのスレッドはdaemon thread
に設定され、ファントム到達可能オブジェクトを処理し、クリーン・アクションを起動します。 各呼び出しで、thread factory
は、クリーニング・アクションを実行するのに適したスレッドを提供する必要があります。ファントムに到達し、登録されたすべてのクリーニング動作が完了すると、クリーナは終了します。
- パラメータ:
threadFactory
- 新しいThread
を返してクリーニング・アクションを処理するThreadFactory
- 戻り値:
- 新しい
Cleaner
- 例外:
IllegalThreadStateException
- スレッド・ファクトリからのスレッドがnot a new thread
の場合。SecurityException
- 現在のスレッドがスレッドの作成または開始を許可されていない場合。
-
register
public Cleaner.Cleanable register(Object obj, Runnable action) オブジェクトにファントム到達可能になったときに実行するオブジェクトとクリーニング・アクションを登録します。 クリーニング動作の動作については、上記の「APIノート」を参照してください。- パラメータ:
obj
- 監視するオブジェクトaction
- オブジェクトがファントム到達可能になったときに呼び出すRunnable
- 戻り値:
Cleanable
インスタンス
-