パブリック クラスが実行{ // 別のスレッドであるクラスThreadLocalの変数は分離の異なるスレッド間で解決されるが、独自の値を持つ // のThreadLocalに配置することができる異なるスレッドの値を保存します。 パブリック 静的 ThreadLocalのT1 = 新しい新規のThreadLocal(); 公共の 静的な 無効メイン(文字列[]引数){ IF(t1.get()== NULL ){ するSystem.out.println( "離さない値" ); T1。 SET( "私の値" ); } System.out.printlnは(t1.get()); System.out.printlnは(t1.get()); // 値を聞かせて決して // I値 //私は価値 } }
// ThreadLocalの、異なるスレッドは、スレッド間で分離されて同一のターゲットに対応する本明細書において実証 ThreadLocalの変更が、互いに影響しない、//スレッドBとスレッド パブリック クラスを実行{ // 検証スレッド変数分離 パブリック スタティック T1 = ThreadLocalの新しい新規のThreadLocal(); 公共の 静的な 無効メイン(文字列[]引数){ スレッドA Aに = 新しい新しいスレッドAにおける(); 及びThreadB Bという = 新しい新しいとThreadB()は、 a.start(); b.start(); 試み{ 用(int型、Iが10 <; I = 0 Iは++ ){ t1.setを( "メイン" +(1 + I。)); System.out.println( "メインGET値=" + t1.get()); Thread.sleep( 200 )。 } } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } 静的 クラススレッドAが延びているスレッドが{ @Override 公共 ボイドラン(){ 試みる{ ため(int型 i = 0; iは<10; I ++ ){ t1.set( "スレッドA" +(I + 1))。 System.out.println( "スレッドAが値を取得=" + t1.get()); Thread.sleep( 200 )。 } } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } 静的 クラス ThreadBが延びているスレッドが{ @Override 公共 ボイドラン(){ 試みる{ ため(int型 i = 0; iは<10; I ++ ){ t1.set( "ThreadB" +(I + 1)); System.out.println( "ThreadB GET値=" + t1.get()); Thread.sleep( 200 )。 } } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } } メインGET値 = MAIN1 スレッドA GET値 = ThreadA1 ThreadB GET値 = ThreadB1 ThreadB GET値 = ThreadB2 スレッドA GET値 = ThreadA2 主GET値 =メイン2 メインGET値 = main3 ThreadB GET値 = ThreadB3 スレッドAのget値 = ThreadA3 スレッドA取得値 = ThreadA4 ThreadB GET値 = ThreadB4 メインGET値 = main4 スレッドAのget値 = ThreadA5 ThreadB GET値 = ThreadB5 メインGET値 = main5 メインGET値 = main6 値を取得ThreadB = ThreadB6 スレッドAが値を取得 = ThreadA6 メインGET値を = main7 値を取得ThreadB = ThreadB7 スレッドAのget値 = ThreadA7 スレッドA取得値 = ThreadA8 ThreadB GET値 = ThreadB8 メインGET値 = main8 スレッドAのget値 = ThreadA9 ThreadB GET値 = ThreadB9 メインGET値 = main9 メインGET値 = main10 スレッドAのget値 = ThreadA10 値を取得ThreadB = ThreadB10
//ここで説明し、スレッドごとに別々の変数に格納し、内部スレッドはThreadLocalの値を変更することができる場合は、各スレッド
//ここでは、我々が必要とするタイプを追加することができますが、文字列型は、毎回、スレッド内であり、 ThreadLocalの値が変更されている
公共の クラスを実行します{
// 验证线程变量的隔离性 パブリック 静的 ThreadLocalのT1 = 新しいThreadLocalの()。 パブリック 静的 ボイドメイン(文字列[]引数){ スレッドA A = 新しいスレッドA(); ThreadB B = 新しいThreadB()。 a.start(); b.start(); } 静的 クラススレッドAが延びているスレッドが{ @Override 公共 ボイドラン(){ 試みる{ ため(int型、iは5 <; I = 0 iは++します){ t1.set( "スレッドA" +(I + 1 )); System.out.println( "スレッドA 1 GET値=" + t1.get()); System.out.println( "スレッドA 2 GET値=" + t1.get()); Thread.sleep( 200 )。 } } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } 静的 クラス ThreadBは拡張スレッド{ @Override 公共 ボイドの実行を(){ してみてください{ ため(int型、iは5 <; I = 0 iは++ ){ t1.setを( "ThreadB" +(I + 1 ))。 System.out.println( "ThreadB GET値=" + t1.get()); Thread.sleep( 200 )。 } } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } } スレッドA 1つのGET値= ThreadA1 スレッドA 2 GET値= ThreadA1 ThreadB GET値 =ThreadB1 ThreadB GET値 = ThreadB2 スレッドA 1 GET値= ThreadA2 スレッドA 2 GET値= ThreadA2 ThreadB GET値 = ThreadB3 スレッドA 1 GET値= ThreadA3 スレッドA 2 GET値= ThreadA3 スレッドA 1 GET値= ThreadA4 ThreadB GET値 = ThreadB4 スレッドA 2 GET値= ThreadA4 スレッドA 1つのGET値= ThreadA5 ThreadB GET値 = ThreadB5 スレッドA 2 GET値= ThreadA5