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

クラスCleaner

java.lang.Object
java.lang.ref.Cleaner

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

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

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

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

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

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

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

CleaningExampleがtry-finallyブロックで使用されている場合、closeメソッドはクリーニング・アクションを呼び出します。 closeメソッドがコールされない場合、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 
    Cleanableは、Cleanerに登録されているオブジェクトとクリーニング・アクションを表します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    static Cleaner
    新しいCleanerを返します。
    static Cleaner
    create(ThreadFactory threadFactory)
    ThreadFactoryからThreadを使用して新しいCleanerを返します。
    register(Object obj, Runnable action)
    オブジェクトと、オブジェクトがファントムに到達可能になったときに実行するクリーニング・アクションを登録します。

    クラスjava.lang.Objectで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • メソッドの詳細

    • 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インスタンス