자바 동시 프로그래밍 뷰티 - 1 개 기록 읽기

1.1 스레드는 무엇입니까?

  첫 번째 스레드가 물리적 인 과정이기 때문에, 과정이 무엇인지 이해해야합니다 스레드를 이해하기 전에. (스레드는 독립적으로 존재하지 않을 것이다)

  프로세스 : 코드가 데이터 수집 활동에서 실행되는 시스템 자원 할당 및 스케줄링의 기본 단위이며, 스레드, 다중 스레드 공유 프로세스를 실행 프로세스의 경로, 프로세스가 적어도 하나 개의 스레드를 가질 것입니다 자원 과정.

  스레드 : CPU가 할당의 기본 단위입니다.

  

  위의 표에서 볼 수 있듯이,이 과정을 여러 스레드, 힙 및 방법 영역을 공유하는 여러 스레드를 수 있지만 각 스레드는 자신의 스택 및 프로그램 카운터를해야합니다.

왜 스택 하시겠습니까 및 프로그램 카운터는 그것을 개인 스레드 수 있나요? 
    말했다 스레드의 앞에 실행 CPU, CPU의 기본 단위는 일반적으로 라운드 로빈 (round-robin) 폴링 점유 사용하므로 현재의 thread의 CPU 타임 슬라이스가 사용될 때, 호출에서 다음에 대한 자신의 차례를 기다리고, CPU를하자 . 
그 질문은, 실행 전에 알고 얼마나 스레드에서 등장? 
    프로그램 카운터를 기록하기 전에 그것은 CPU가, 당신이 다음 번에 다시 실행될 때, 아래로 계속 프로그램 카운터의 구현 이전 위치로 얻을 수있을 때 주소가 실행할 수 있도록하는 것입니다. (프로그램 카운터 어드레스가 원시 메소드 실행에 기록되지 않고,이 어드레스 자바 코드 실행을 기록) 및 스택은 사용 후 다시 로컬 변수의 저장 사이트 인

 

1.2 스레드를 생성하고 실행하려면

  세 가지 방법 : 상속 스레드 (호출 인터페이스를 달성하기 위해)의 Runnable를 사용 FuthreTask 방법을 구현한다.

패키지 com.nxz.blog.otherTest; 

수입 java.util.concurrent.Callable;
수입 java.util.concurrent.ExecutionException;
수입 java.util.concurrent.FutureTask; 

공공  클래스 TestThread는 { 

    정적  클래스 MyThread1는 확장 스레드 { 
        @Override 
        공공  무효 실행 () { 
            에서 System.out.println ( "확장-스레드 :"+ this.getName () ); 
        } 
    } 

    정적  클래스 MyThread2는 구현 의 Runnable { 

        @Override 
        공공  무효 () {실행
            에서 System.out.println ( "구현-의 Runnable :"+는 Thread.currentThread () ); 
        } 
    } 

    정적  클래스 MyThread3이 구현 호출 가능는 <문자열> { 

        @Override 
        공개 문자열 () 호출이 발생 예외 { 

            에서 System.out.println ( "구현 호출 가능는"+는 Thread.currentThread () );
            반환 "호출 가능接口을" ; 
        } 
    } 


    공공  정적  무효 메인 (문자열 []를 인수) { 
        MyThread1 T1 = 새로운 MyThread1 (); 
        t1.start ();

        스레드 T2 = 새로운 스레드 ( 새로 MyThread2 ()); 
        t2.start (); 

        FutureTask <문자열> = futureTask 새로운 FutureTask <> ( 새로 MyThread3 ());
        새로운 스레드 (futureTask) .start ();
        시도 {
             // 阻塞,等待执行完毕,并返回结果 
            문자열 고해상도 = futureTask.get (); 
            에서 System.out.println (해상도); 
        } 캐치 (예외 : InterruptedException 전자) { 
            e.printStackTrace (); 
        } 캐치 (ExecutionException 전자) {  
            e.printStackTrace ();
        }

        에서 System.out.println ( "메인 스레드" ); 
    } 
}

  결과 위의 코드 :

확장 - 스레드 : 스레드 0이
 구현 -Runnable : 나사 [실 -1,5- 메인하면]
 구현 스레드 [실 -2,5- : -Callable 주] 
호출 가능接口
메인 -thread을

  사용자가 생성 한 스레드는 스레드에, CPU 리소스를 획득 한 후, (즉, 스레드가 이미 실행의 CPU 타임 슬라이스를 기다리는 CPU 자원을 제외한 다른 자원을 인수했다고 말을하는 것입니다) 준비 상태에 이미 현재의 thread를 대표하는 시작 메소드를 호출 운전 상태는, (그 범위 스레드에 대해) 완료 실행 방법 일단 스레드는 상태를 종료한다.

  상속 혜택을 사용하여 현재의 thread를 얻기 위해 실행에서 직접이 방법을 사용할 수있는 필요는 Thread.currentThread ()하지 않고, (다른 두이 더 getName 등입니다 몇 가지 방법이 있습니다).

1.3 스레드 및 알림 기다립니다

  다음 세 가지 방법이 방법은 모든 개체, 일반적인 클래스 객체입니다

  ①wait ()

    스레드가 대기 () 메소드를 호출하면 스레드가 대기중인 차단됩니다,라고 알고 통지 /의 notifyAll 또는 다른 스레드가 차단 방법이 스레드를 중단 호출

  ②wait (긴 시간 초과)

    테이블 위에 더 다른 스레드가 깨어 나면없는 경우 대기 기간 동안 제한 시간보다 (/의 notifyAll 통지) 스레드가 스레드는 여전히 자동으로 타임 아웃 시간을 초과 한 후 반환됩니다

  ③wait (긴 시간 초과의 나노 INT) : 두 개의 매개 변수, 제한 시간 (밀리 초), 나노 나노초 (긴 시간 초과) 방식이 내부 호출 기다린 두번째 파라미터 만 나노초의 범위는 0보다 큰 경우, 이하면 백만 (1,000,000 NS = 1 밀리 초) 후, 타임 아웃을 더한 제 2

    공용  최종  공극 대기 (  타임 아웃, INT의 나노)는 슬로우 예외 : InterruptedException {
         경우 (타임 아웃 <0 ) {
             던져  새로운 , IllegalArgumentException를 ( "타임 아웃 값이 음수" ); 
        } 
        경우 (나노 <0 || 나노> 999999 ) {
             던져  새로운 IllegalArgumentException가 (
                                 "범위를 벗어 나노초 시간 제한 값을" ); 
        } 
        만약 (나노> 0 ) { 
            초과 ++ ; 
        }
        (타임 아웃) 기다려;
    }

  ④notify () /의 notifyAll ()

    같은 공유 변수 대기 차이에 스레드를 깨워 : 웨이크-A, 웨이크를 모두

  그것은 주목해야한다 :

  * 거짓 웨이크 :

    스레드가 다른 스레드를 통보 (),가는 notifyAll () 메소드 호출되지 않은 스레드가 통지 경우에도 일시 중단 된 상태에서 상태 (즉 일어나입니다) 실행, 변경 또는 중단하거나 제한 시간을 기다릴 수있다, 이것은 잘못된 웨이크이다

  (이것은 자바 병행 프로그래밍으로 미국에 설명되어 느낌이 명확하지 않다, 일부는 설명 기타 정보를 찾고 있습니다 : 멀티 코어 프로세서에서 다른 스레드가 동일한 조건 변수를 차단 (다중 스레드를 깨울 수 있습니다 신호 스레드) 또 다른 스레드가 동일한 코드를 수행 한 후에 문제가 발생하기 전에, 결과,보다 스레드 코드 로직의 실행 후에 깨어나)

    예 : 아무 문제가 없다 (즉은, 싱글 스레드입니다) 생산자와 소비자의 경우 경우 다음 코드를 각각 생산자와 소비자에, 거짓 일어나 없다, 다중 스레드 환경의 경우, 프로듀서가 완료되면, 방법의 notifyAll 호출 한 후 거기에서 최초의 소비자 지출의 완성, 소비자 지출 후 다른 모든 생산자와 소비자를 깨워 것, 그 다음의 문제 (즉,의 출현이다있을 것 허위 알람)이 문제의 해결책은, 조건부 경우 (queue.size () == 1 소비자 생산자 임) 및 경우 (queue.isEmpty ()) 대신 동안 (queue.size () == 1)하면서 (queue.isEmpty는 ()), 즉이 일어나 각 스레드가 자격을 다시 결정하는 것을 결정할 때주기 변경

    정적 큐 큐; 

    정적  클래스 ProductThread (가) 확장 스레드 { 
        @Override 
        공개  공극 RUN () {
             동기 (큐) {
                 IF (. queue.size () == 1 ) {// 대상 대기열 저장을 가정
                     은 try을 { 
                        queue.wait () ; 
                    } 캐치 (예외 : InterruptedException E) { 
                        e.printStackTrace (); 
                    } 
                } 

                queue.add ( 새로운 새로운 객체 ()); 
                queue.notifyAll ();
            }  
        }
    } 

    정적  클래스 ConsumerThread는 확장 스레드 { 
        @Override 
        공공  무효 실행 () { 

            동기 (큐) {
                 경우 (queue.isEmpty은 ()) {
                     시도 { 
                        queue.wait (); 
                    } 캐치 (예외 : InterruptedException 전자) { 
                        e.printStackTrace (); 
                    } 
                } 

                queue.poll (); 
                queue.notifyAll (); 
            } 
        } 
    }

 

1.4 대기 스레드는 방법을 가입 완료

  당신이 가입 방법 (Thread 클래스에 속한)를 호출 할 때 계속하는 것은 아래로 실행하는 동안 스레드를 기다리고있을 것입니다 것은, 완료

  예를 들면 :

패키지 com.nxz.blog.otherTest; 

공공  클래스 TestThread002는 { 

    정적  클래스 MyThread는 확장 스레드 { 
        @Override 
        공공  무효 실행 () { 
            에서 System.out.println ( "myThread을" ); 
        } 
    } 

    공공  정적  무효 메인 (문자열 [] 인수)이 발생 예외 : InterruptedException { 
        MyThread의 T1 = 새로운 MyThread를 (); 
        t1.setName ( "myThread" ); 
        t1.start (); 

        //코드가 아래에 주석 처리하면, 출력은 주요 방법 MyThread 메인 쓰레드 시도한다되어야
         // 메인 스레드가 메인 스레드를 대기하는 경우의 개봉 후 추궁, T1을 종료한다 
        ) (t1.join 단계; 

        에서 System.out.println ( "메인 스레드" ); 
    } 
}

 

휴면 1.5sleep 방법

  스레드가 수면 메서드를 호출 할 때 잠에서 정적 메소드 스레드 (), 간단하게 (즉, CPU 스케줄링에 참여하지입니다)하지만, 잠금 및 기타 리소스를 소유하고있는 스레드가 그것을 출시되지 않은 CPU 임원 전원을하자 다른 방법 기다립니다

1.6 CPU 임원 전원 수율 방법을 보자

  수율 정적 메소드 스레드 (), 스레드 () Thread.yield를 호출, 테이블은 항복 후, CPU를 사용할 수있는 권리, 준비 상태에서 현재 스레드를 포기하는 현재의 thread의 이름을 지정합니다. 스레드 스케줄러는 임의의 스레드를 포함하는 모든 스레드에서 할당 한 실행 쓰레드 CPU 시간 슬라이스를 선택한다.

1.7 인터럽트 스레드

  자바 스레드는 스레드 모드 직접 스레드를 중단하지 않는 인터럽트 플래그를 설정하여 스레드 간의 협력을 방해하지만, 스레드는 인터럽트 플래그의 재량에 따라 차단된다.

  보이드 interruupt () 스레드 인터럽트

  부울 isInterrupted () : 현재 탐지가 영어가 중단 된 자동차이다 (isInterrupted () 메소드 인터럽트 플래그 인스턴스를 호출)

  현재 스레드 (암나사 대신 실시 예 () 메소드를 호출 interruupted 현재 인터럽트 플래그를 얻을 플래그를 방해한다) 중단 여부를 검출 : 부울 () 인터럽트

 1.8 스레드 컨텍스트 스위칭

  멀티 스레드 프로그램 스레드가 한번에 하나의 스레드에 의해 사용 된 CPU, CPU와 각 번호의 개수보다 일반적으로 더 크다. 사용자가 정말 동시에 수행 느낄 수 있도록하기 위해, 자원 할당의 CPU 타임 슬라이스 속도는 측면 폴링을 사용하여.

  컨텍스트 스위칭 : 스레드가 타임 슬라이스를 사용하여 완료되면, CPU 리소스가 다른 스레드를주고, 준비 상태로 상태를 스레드합니다.

1.9 스레드 교착

  다른 요인이 없기로 인해 각 주 대기로 인한 자원에 대한 경쟁 구현 프로세스의 다중 스레드, 스레드는 계속 실행 할 수 없습니다 기다립니다.

  2는 상호 배타적, 1 및 대기 루프를 요청 자원 (3, 4)은 부정 할 수 없다 보유 : 교착 상태 조건은 다음과 같다

1.10 데몬 스레드와 사용자 스레드

  데몬 스레드 : 가비지 컬렉션 스레드와 유사

  사용자 스레드 : 주요 기능이 활성화되어, 사용자는 간단한 스레드

  JVM 정지 타이밍 : 사용자가 모든 스레드를 완료 한 후, JVM이 (또는 데몬 스레드없이) 중지

1.11ThreadLocal

  ThreadLocal을 변수를 생성 한 후, 사실, 변수를 운영 다중 스레드, 즉, 각 스레드가 자신의 로컬 메모리에 변수 복사합니다되고, 자신의 로컬 메모리 변수를 운영하고 있습니다.

  ThreadLocal를 어떻게 스레드와 연관이있다?

    ThreadLocal를 실제로 ThreadLocal를 폭넓게 전화 또는 방법을 얻을 빈 셸 내부 메소드를 호출하는 스레드의 값을 배치 ThreadLocals을 변수 (ThreadLocal.threadLocalMap)으로 설정하고, 그 로컬 변수의 ThreadLocal 인스턴스의 존재 아니다 그러나에 ThreadLocals을에 스레드를 적립.

    공개  공극 세트 (T 값) { 
        스레드 T = 는 Thread.currentThread (); 
     // ThreadLocal를 호출 할 때 변수가 널인 경우 사실, 현재 스레드 나사 ThreadLocalMap 변수를 획득하는 방법을 설정하면, 새로운 ThreadLocalMap, 변수가 존재하는 경우, 현재 스레드와 맞춤형지도 (ThreadLocalMap)에 저장된 값과 ThreadLocalMap 맵
= 하여 getMap (t), IF (MAP =! ) map.set ( 이 본 가치) 사람의 CreateMap (t, 값) }   //하여 getMap 소스는 현재 스레드 ThreadLocals을 가변 인수한다는 사실로부터 알 수 ThreadLocalMap하여 getMap (스레드 T) {
반환 ; t.threadLocals를 } 무효createMap (스레드 t, T firstValue) { t.threadLocals = 새로운 ThreadLocalMap ( , firstValue); }
    공용 T의 GET () { 
     // 메소드있어 ThreadLocal 얻을, 그것은 또한 (데이터 즉 ThreadLocalMap 유형) 현재 쓰레드의 쓰레드 ThreadLocals을 변수로 얻어 스레드 T
= 는 Thread.currentThread (); ThreadLocalMap지도 = 하여 getMap (T); IF (!지도 = 널 (null) ) { ThreadLocalMap.Entry E = map.getEntry ( 다음은이 ), IF (! E = 널 (null) ) { @SuppressWarnings ( "검사되지 않은" ) T 결과 = (T) e.Value, 반환 결과; } } 반환setınitialvalu A (); }

 

  

 

    

추천

출처www.cnblogs.com/nxzblogs/p/11318671.html