"자바 멀티 스레드 프로그래밍의 핵심 기술"----의 ThreadLocal

공공  클래스는 실행 {
     // 다른 스레드 자신의 값을 가지는 변수는 분리의 다른 스레드 사이에 해결의 ThreadLocal 클래스는,
     // ThreadLocal를 배치 할 수있는 다른 스레드의 값이 저장 될 수있다. 
    공용  정적 있어 ThreadLocal T1 = 새로운 새 있어 ThreadLocal (); 

    공공  정적  무효 메인 (문자열 []에 args) {
         IF (t1.get () == ) { 
            에서 System.out.println는 ( "값을주지 않을" ) 
            T1한다. 는 SET ( "내 값" ); 
        } 

        에서 System.out.println (t1.get ()); 
        에서 System.out.println (t1.get ()); 
        // 값을주지 않을
         // 내가 가치
         //나는 가치    
    } 
}
// ThreadLocal를, 다른 스레드가 스레드 사이에 고립되어 동일한 대상에 해당 여기에 입증 
ThreadLocal를 수정하면서 서로 영향을주지 않습니다, // 스레드 B 및 스레드 
공공  클래스를 실행 {
     // 검증 스레드 변수 분리 
    공공  정적 T1은의 ThreadLocal = 새로운 새 상기의 ThreadLocal ()를 

    공용  정적  무효 {메인 (문자열 [] 인수)를 
        ThreadA (A)에 = 새로운 새 ThreadA ()에서, 
        그 ThreadB B = 새로운 신규 하고 ThreadB (); 
        a.start (); 
        b.start () 
        은 try {
              ( int로 ; I <10, I = 0이 I ++ ) { 
                t1.set를 ( "메인"+ (1 + I.)); 
                에서 System.out.println ( "기본 GET 값 ="+ t1.get ()); 
                Thread.sleep를 ( 200 ); 
            } 

        } 캐치 (예외 : InterruptedException 전자) { 
            e.printStackTrace (); 
        } 

    } 

    정적  클래스 ThreadA는 연장 스레드 { 
        @Override 
        공개  공극 실행 () {
             시도 {
                 위해 ( int로 I = 0; I <10은, I ++ ) { 
                    t1.set ( "ThreadA"+는 (i + 1 ));
                    에서 System.out.println ( "ThreadA 얻을 값 ="+ 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 ="+ t1.get ()); 
                    Thread.sleep를 ( 200 ); 
                } 

            } 캐치 (예외 : InterruptedException 전자) { 
                e.printStackTrace (); 
            } 

        } 
    } 

} 
메인 GET 값 = 메인 1 
ThreadA GET 값 = ThreadA1 
ThreadB GET 값 = ThreadB1 
ThreadB GET 값 = ThreadB2 
ThreadA GET 값 = ThreadA2 
메인 GET 값 = 메인 2
메인 GET 값 = main3 
ThreadB GET 값 = ThreadB3 
ThreadA GET 값 = ThreadA3 
ThreadA 얻을 값 = ThreadA4 
ThreadB GET 값 = ThreadB4 
메인 GET 값 = main4 
ThreadA GET 값 = ThreadA5 
ThreadB GET 값 = ThreadB5 
메인 GET 값 = main5 
메인 GET 값 = main6 
가치를 ThreadB = ThreadB6 
ThreadA 값 수 = ThreadA6 
주요 GET 값을 = main7
가치를 ThreadB = ThreadB7 
ThreadA GET 값 = ThreadA7 
ThreadA 얻을 값 = ThreadA8 
ThreadB GET 값 = ThreadB8 
주요 GET 값 = main8 
ThreadA GET 값 = ThreadA9 
ThreadB GET 값 = ThreadB9 
주요 GET 값 = main9 
주요 GET 값 = main10 
ThreadA GET 값 = ThreadA10 
가치를 ThreadB = ThreadB10

 

// 각 스레드는 각 스레드에 대한 별도의 변수를 저장, 여기에 기술되고, 내부 스레드의 ThreadLocal 값을 변경할 수있는 경우 
// 우리가 필요로하는 종류를 추가 할 수있다, 여기에서 스트링 형 스레드 내부마다 인 의 ThreadLocal 값이 변경되었습니다
공공 클래스 실행을 {
// 验证线程变量的隔离性
    공개  정적 ThreadLocal를 T1 = 의 ThreadLocal (); 

    공공  정적  무효 메인 (문자열 []에 args) { 
        ThreadA = 새로운 ThreadA (); 
        ThreadB B = 새로운 ThreadB (); 
        a.start (); 
        b.start (); 
    } 

    정적  클래스 ThreadA는 확장 스레드가 { 
        @Override 
        공공  무효 실행 () {
             시도 {
                 에 대한 ( int로 , 내가 5 <나는 = 0 내가 ++ ) {
                    t1.set ( "ThreadA"+ (I + 1 )); 
                    에서 System.out.println ( "GET ThreadA 1 값 ="+ t1.get ()); 
                    에서 System.out.println ( "GET ThreadA 2 값 ="+ t1.get ()); 
                    Thread.sleep를 ( 200 ); 
                } 

            } 캐치 (예외 : InterruptedException 전자) { 
                e.printStackTrace (); 
            } 

        } 
    } 

    정적  클래스 ThreadB는 확장 스레드 { 
        @Override 
        공공  무효 실행 () {
             시도{
                 위해 ( int로 ; I <5, I = 0 난 ++ ) { 
                    t1.set를 ( "ThreadB"+ (I + 1 )); 
                    에서 System.out.println는 ( "값을 얻을 ThreadB ="+ t1.get ()); 
                    Thread.sleep를 ( 200 ); 
                } 

            } 캐치 (예외 : InterruptedException 전자) { 
                e.printStackTrace (); 
            } 

        } 
    } 

} 
ThreadA 1 GET 값 = ThreadA1 
ThreadA 2 GET 값 = ThreadA1 
ThreadB GET 값 =ThreadB1 
ThreadB 값을 얻을 = ThreadB2 
ThreadA 1 개 GET 값 = ThreadA2 
ThreadA 2 GET 값 = ThreadA2 
ThreadB GET 값 = ThreadB3 
ThreadA 1 개 GET 값 = ThreadA3 
ThreadA 2 GET 값 = ThreadA3 
ThreadA 1 개 GET 값 = ThreadA4 
ThreadB GET 값 = ThreadB4 
ThreadA 2 GET 값 = ThreadA4 
ThreadA 1 개 GET 값 = ThreadA5 
ThreadB GET 값 = ThreadB5 
ThreadA 2 GET 값 = ThreadA5

 

추천

출처www.cnblogs.com/windy13/p/11318639.html