モジュール java.base
パッケージ java.lang.ref

クラスクリーナー


  • public final class Cleaner
    extends Object
    Cleanerは、一連のオブジェクト参照および対応するクリーニング・アクションを管理します。

    クリーニングアクションは、オブジェクトがファントムに到達可能になったことがクリーナに通知されたあとで実行される registeredです。 クリーナは、PhantomReferenceおよび ReferenceQueueを使用して、到達可能性が変更されたときに通知を受けます。

    各クリーナは独立して動作し、保留中のクリーニングアクションを管理し、クリーナが使用されなくなったときにスレッド化と終了を処理します。 オブジェクト参照および対応するクリーニング・アクションを登録すると、Cleanableが返されます。 最も効率的な使用方法は、オブジェクトが閉じられるか不要になったときに、cleanメソッドを明示的に起動することです。 クリーニングアクションは、オブジェクトがすでに明示的にクリーンアップされていないかぎりファントムに到達可能になったときに、最大で1回呼び出される Runnableです。 クリーニングアクションは、登録されているオブジェクトを参照してはいけません。 その場合、オブジェクトはファントムに到達できず、クリーニングアクションは自動的に呼び出されません。

    クリーニングアクションの実行は、クリーナに関連付けられたスレッドによって実行されます。 クリーニングアクションによってスローされたすべての例外は無視されます。 クリーナおよびその他のクリーニングアクションは、クリーニングアクションの例外の影響を受けません。 スレッドは、登録されたすべてのクリーニングアクションが完了し、クリーナ自体がガベージコレクタによって再利用されるまで実行されます。

    System.exit中のクリーナの動作は実装に固有です。 クリーニングアクションが呼び出されるかどうかは保証されません。

    ほかで指定がない場合、null引数をコンストラクタまたはこのクラスのメソッドへ渡すと、NullPointerExceptionがスローされます。

    APIのノート:
    クリーニングアクションは、関連するオブジェクトがファントムに到達可能になったあとでのみ呼び出されるため、クリーニングアクションを実装するオブジェクトがオブジェクトへの参照を保持しないことが重要です。 この例では、静的クラスがクリーニング状態とアクションをカプセル化します。 内部クラス(匿名かどうか)は、外部インスタンスへの参照が暗黙的に含まれているため、ファントムに到達できないようにするため、使用しないでください。 新しいクリーナーの選択または既存のクリーナーの共有は、ユースケースによって決まります。

    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();
            }
        }
     
    クリーニング・アクションはラムダでもかまいませんが、クリーニング中のオブジェクトのフィールドを参照して、オブジェクトがファントムに到達できないようにすることで、オブジェクト参照を簡単に取得できます。 前述のように、静的なネストされたクラスを使用すると、オブジェクト参照が誤って保持されなくなります。

    クリーニング・アクションは、他のクリーニング・アクションと同時に呼び出すように準備する必要があります。 通常、クリーニングアクションは実行が速く、ブロックしないようにしてください。 クリーニングアクションがブロックされると、同じクリーナに登録されているほかのクリーニングアクションの処理が遅延することがあります。 クリーナに登録されているすべてのクリーニングアクションには、相互互換性が必要です。

    導入されたバージョン:
    9
    • メソッドの詳細

      • create

        public static Cleaner create()
        新しいCleanerを返します。

        クリーナは、ファントム到達可能オブジェクトを処理し、クリーニング・アクションを起動するdaemon threadを作成します。 スレッドのコンテキスト・クラス・ローダーsystem class loaderに設定されます。 スレッドには権限がなく、SecurityManager is setの場合にのみ適用されます。

        クリーナは、ファントムが到達可能であり、登録されているすべてのクリーニングアクションが完了すると終了します。

        戻り値:
        新しいCleaner
        例外:
        SecurityException - 現在のスレッドでスレッドの作成または起動が許可されていない場合。
      • create

        public static Cleaner create​(ThreadFactory threadFactory)
        ThreadFactoryThreadを使用して、新しい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 Note」を参照してください。
        パラメータ:
        obj - 監視するオブジェクト
        action - オブジェクトがファントムに到達可能になったときに呼び出すRunnable
        戻り値:
        Cleanableインスタンス