「Javaのマルチスレッドプログラミングのコア技術」----のThreadLocal

パブリック クラスが実行{
     // 別のスレッドであるクラス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

 

おすすめ

転載: www.cnblogs.com/windy13/p/11318639.html
おすすめ