まず、Java子スレッドの親スレッドのthreadLocalの値を取得します
threadLocalはスレッドレベルのデータ分離を実行できるので、子スレッドで親スレッドの値を取得するにはどうすればよいですか?InheritableThreadLocalを使用できます
/ ** * Java子线程Thread取父线程的threadLocal中的值 * / public class ThreadDemo1 { public static final InheritableThreadLocal <String> inheritableThreadLocal = new InheritableThreadLocal <>(); public static final ThreadLocal <String> threadLocal = new ThreadLocal <>(); public static void main(String [] args)は例外をスローします{ inheritableThreadLocal.set( "inheritableThreadLocal hello"); threadLocal.set( "threadLocal world"); 新しいThread(()-> { System.out.println(String.format( "子线程可继承值:%s"、inheritableThreadLocal.get())); System.out.println(String.format( "子线程值:%s "、threadLocal.get())); System.out.println(String.format( "Sunスレッドは値を継承できます:%s"、inheritableThreadLocal.get())); System.out.println(String.format( "Sunスレッド値:%s"、threadLocal。 get())); })。start(); })。start(); Thread.sleep(3000); System.out.println( "--------------変更可能 threadLocalとthreadLocalの継承値-------------------- "); inheritableThreadLocal.set(" inheritableThreadLocal hello2 "); threadLocal.set(" threadLocal world2 "); 新しいスレッド(()-> { System.out.println(String.format( "子スレッドは値を継承できます:%s"、inheritableThreadLocal.get())); System.out.println(String.format( "子スレッド値:%s "、threadLocal.get())); 新しいスレッド(()-> { System.out.println(String.format( "Sunスレッドは値を継承できます:%s"、inheritableThreadLocal.get())); System.out.println(String.format( "Sunスレッド値:%s"、threadLocal。 get())); })。start(); })。start(); } }
出力は次のとおりです。
子スレッドの継承可能な値:inheritableThreadLocal hello 子スレッドの値:null 孫スレッドの継承可能な値:inheritableThreadLocal hello 孫のスレッド値:null -------------- threadLocalとthreadLocal-の継承可能な値を変更する------------------- 子スレッドの継承可能な値:inheritableThreadLocal hello2 子スレッドの値:null 孫スレッドの継承可能な値:inheritableThreadLocal hello2 孫のスレッド値:null
親スレッドのinheritableThreadLocal値は、子スレッドと孫スレッドで取得できることを説明します。inheritableThreadLocalの値を変更すると、子スレッドと孫スレッドでも親スレッドのinheritableThreadLocalの値を取得できます。
しかし、threadLocalは機能せず、取得した値は空です。
2.スレッドを作成するためのソースコードを表示する
private void init(ThreadGroup g、Runnable target、String name、 long stackSize、AccessControlContext acc、 boolean inheritThreadLocals){ ...... if(inheritThreadLocals && parent.inheritableThreadLocals!= null) this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parent。 inheritableThreadLocals); / * VMが気にする場合に備えて、指定されたスタックサイズを 隠します* / this.stackSize = stackSize; / *スレッドIDを設定* / tid = nextThreadID(); } //ThreadLocal.createInheritedMap static ThreadLocalMap createInheritedMap(ThreadLocalMap parentMap){ return new ThreadLocalMap(parentMap); }
スレッドが作成されると、initメソッドが呼び出され、親スレッドのinheritableThreadLocalsがinheritableThreadLocalsに割り当てられることがわかります(ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;)