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) にご注意ください。