ホームページ > Java > &#&チュートリアル > Java ローカル スレッド (ThreadLocal)

Java ローカル スレッド (ThreadLocal)

黄舟
リリース: 2017-02-28 10:52:49
オリジナル
2220 人が閲覧しました

Java の ThreadLocal クラスは、作成した変数が同じスレッドによってのみ読み書きできるようにします。したがって、2 つのスレッドが同じコードを実行していて、そのコードに ThreadLocal 変数への参照がある場合でも、2 つのスレッドは互いの ThreadLocal 変数を認識できません。

ThreadLocal の作成

ここに、ThreadLocal の作成方法を示すコードがあります:

private ThreadLocal myThreadLocal = new ThreadLocal();
ログイン後にコピー


ご覧のとおり、新しい ThreadLocal オブジェクトをインスタンス化します。これはスレッドごとに 1 回だけ行う必要があります。異なるスレッドが ThreadLocal にアクセスする同じコードを実行した場合でも、各スレッドは独自の ThreadLocal インスタンスのみを参照します。 2 つのスレッドが同じ ThreadLocal オブジェクトに異なる値を設定した場合でも、それらは互いの値を認識しません。

ThreadLocal へのアクセス

ThreadLocal が作成されたら、次のように保存する値を設定できます:

myThreadLocal.set("A thread local value");
ログイン後にコピー

次のように値を読み取ることができます:

String threadLocalValue = (String) myThreadLocal.get();
ログイン後にコピー

この get メソッドはオブジェクトを返し、これを返します。 set メソッドはオブジェクトをパラメータとして渡します。

Generic ThreadLocal

get メソッドを呼び出すときに強制的に変換する必要がないように、汎用 ThreadLocal を作成できます。以下に例を示します:

private ThreadLocal<String> myThreadLocal = new ThreadLocal<String>();
ログイン後にコピー

これで、文字列型は ThreadLocal インスタンスにのみ保存できるようになります。さらに、この値の変換を強制する必要はありません:

myThreadLocal.set("Hello ThreadLocal");

String threadLocalValue = myThreadLocal.get();
ログイン後にコピー


ThreadLocal 値を初期化します

ThreadLocal オブジェクトの値の設定は、値を設定するスレッドにのみ表示されるため、どのスレッドも変換できませんset メソッドを使用して設定します。 ThreadLocal の値はすべてのスレッドに表示されます。

代わりに、ThreadLocal をサブクラス化し、initialValue メソッドをオーバーライドすることで、ThreadLocal オブジェクトの初期値を指定できます。次のように:


private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
    @Override protected String initialValue() {
        return "This is the initial value";
    }
};
ログイン後にコピー


これで、set メソッドを呼び出す前に、すべてのスレッドが同じ初期化値を確認できるようになります。

完全な ThreadLocal インスタンス

完全に実行されている ThreadLocal インスタンスです

public class ThreadLocalExample {


    public static class MyRunnable implements Runnable {

        private ThreadLocal<Integer> threadLocal =
               new ThreadLocal<Integer>();

        @Override
        public void run() {
            threadLocal.set( (int) (Math.random() * 100D) );
    
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
    
            System.out.println(threadLocal.get());
        }
    }


    public static void main(String[] args) {
        MyRunnable sharedRunnableInstance = new MyRunnable();

        Thread thread1 = new Thread(sharedRunnableInstance);
        Thread thread2 = new Thread(sharedRunnableInstance);

        thread1.start();
        thread2.start();

        thread1.join(); //wait for thread 1 to terminate
        thread2.join(); //wait for thread 2 to terminate
    }

}
ログイン後にコピー

この例では、2 つの異なるスレッドに渡される個別の MyRunnable インスタンスを作成します。両方のスレッドが run メソッドを実行し、ThreadLocal インスタンスに異なる値を設定しました。この set メソッドの呼び出しが同期であり、ThreadLocal オブジェクトを使用しない場合、2 番目のスレッドは最初のスレッドによって設定された値を上書きします。

ただし、ThreadLocal オブジェクトであるため、お互いの値を確認することはできません。したがって、異なる値を設定および取得します。

InheritableThreadLocal

この InheritableThreadLocal クラスは ThreadLocal クラスのサブクラスです。各スレッドが ThreadLoca 内に独自の値を持つのではなく、このクラスを使用すると、1 つのスレッドとそのスレッドによって作成されたすべての子スレッドの値にアクセスできます。

上記は Java ローカル スレッド (ThreadLocal) の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) にご注意ください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート