자바 - 스레드 - 멀티 스레딩

https://www.cnblogs.com/clamp7724/p/11648308.html

멀티 스레딩의 기초에 내장 된 벡터 자바 보안 스레드를 사용합니다.

핸들을 고정하려고

 

나사 잠금 :

동기화 

동기화 변형 방법을 이용하므로이 방법은 다른 물체의 해제가 사용할 수 있도록하기 위해 사용 후에 만 현재 개체를 잠겨있을 때이 방법을 호출한다.
이것은 여러 개체가 동시에 같은 배송 방법, 제품뿐만 아니라화물 판사가 있는지 여부를 결정하는 방법에 대한 실행 등의 스레딩 문제 (결과 메서드에 액세스 추가 할 수 없습니다, B 방법은 그냥 도망 제품은 오류가) 점점 물건을 시작합니다

{...}) 공공 무효 동기화 된 메소드 이름 (
또는
동기 코드를 실행 한 후 {...} 해제 (잠긴 물체가 필요함)

스레드 제어 :
대기 :
되는 Object.wait () CPU가 다시 자원을 할당 할 때까지 (한 스레드가 죽지 않거나 오류, CPU 자유 시간이 자동으로 실행하기 위해 자원을 할당하므로) 대기 상태로 개체 쓰레드의 구현을 허용, 여기에 주목 개체의 작업은 스레드, 운영 객체를 입력 기다리고 여러 단일 스레드 동일한 개체를 운영, 하나 개의 스레드에 영향을주지 않습니다 다른 스레드입니다.
당신이 this.wait 방법으로 작성하는 경우 (); 대기 상태는 현재 스레드 객체가 아닌 객체의 현재 클래스를 운영에. 예를 들어,이 방법은 this.wait ()가 수행 할 수있는 고장이 스레드 (더 이상 아래로 계속 없음), 웨이크 업 진행하기 전에 대기를 가지고, B의 메소드를 호출합니다. 그것은 C.에 B에 대한 호출에 영향을주지 않습니다
대기 () --- "가사의 상태로 모든 스레드.
가사 스레드 웨이크을 방지하기 위해 시간을 찾을 필요

의 Object.notify :
일어나 현재 객체 (CPU 우선 순위 결정, 또는 사전에 (INT 우선 순위) object.setPriority으로 우선 순위를 설정하는 스레드 우선 순위 1 ~ 10, 최고 10 )

Object.notifyAll :
모든 스레드가 객체를 깨워.

소비자 모델의 생산 :
그것은 창고에 넣고는, 어떤 사람들은 창고에서, 창고 작업이 동시에 같은 사람입니다 걸릴.

주요 기능

패키지 multi_thread; 

공용  클래스 MultiThreadTest {
     공공  정적  무효 메인 (문자열 []에 args) { 
        고객 C1 = 신규 고객 ( "消费者1" ); 
        고객 C2 = 새로운 고객 ( "消费者2" ); 
        고객 C3 = 새로운 고객 ( "消费者3" ); 
        고객 C4 = 새로운 고객 ( "消费者4" ); 

        Productor의 P1 = 새로운 Productor ( "生产者1" ); 
        Productor의 P2 = 새로운 Productor ( ");
         // 생산자 높은 우선 순위, 소비자의 다음 첫 번째 생산 
        p1.setPriority (10 ) 
        (p2.setPriority 10 ); 


        // 초기 10 개 제품, 사 개 소비자가 인당 20 살, 2 생산 최소 20 시간이 (가 살 수 있습니다 생산 소비율> 생산 속도, 충분한 시간) 사고가있을 것입니다 의미 인당 25을 생산하는 사람들 

        c1.start를 (); 
        c2.start (); 
        C3. ) (시작, 
        c4.start를 (); 
        p1.start를 (); 
        p2.start를 (); 


    } 
}

 

 

소비자

패키지 multi_thread는, 

공공  클래스는 고객 를 확장 스레드 { // 소비자가 상품을 받아 구입 
    개인 , 문자열 이름을
     공개 고객 (문자열 이름) {
         다음은이 .name을 = 이름; 
    } 

    공공  무효 실행 () {
         에 대한 ( int로 I = 0; 나는 < (20)는, I ++) {   // 각 소비자 제품 (20)이 필요한 가정 
            ) buyGood을 (; 
        } 
    } 

    개인  무효 () {buyGood을 
        제품 G = Goods.getInstance (); 
        문자열 S = g.removeGood를 ();

        // 잠금 멀티 스레드 코드 {}의 외측 섹션 (오브젝트 잠금) 동기화 첨가 다른 방법
         // 로킹이 방법과 동일한 효과를 얻을
 //         (G) 동기화 {
 //             S = G. removeGood ();
 //         } 

        IF (S =! 널 (null) ) { 
            에서 System.out.println (이름 + "을 구입하신"+ S); 
        } 
        다른 { 
            에서 System.out.println (이름 ! "품절 그것을 발견"+ ); 
        } 
    } 
}

 

생산자

패키지 multi_thread, 

공공  클래스 Productor는 를 확장 스레드 { // 제조업체 증가화물 
    개인 , 문자열 이름
     공개 Productor (문자열 이름) {
         다음은이 .name을 = 이름; 
    } 

    공공  무효 RUN은 () {
         에 대한 ( int로 나는 30 <나는 = 0을 내가 ++) {   // 각 단지 소비자 충족하기 위해 생산하는 (30 개) 제품 생산을 중지한다고 가정 
            ) productGood을 (; 
        } 
    } 

    개인  무효 productGood을 () { 
        제품 G = Goods.getInstance (); 
        문자열 S =g.addGood () 
        에서 System.out.println (이름 + "제조"+ S); 

    } 
}

 

화물 창고

패키지 multi_thread, 

가져 오기 인 java.util.ArrayList의, 

공공  클래스 제품 { // 화물 창고,화물 표현 문자열 

    개인  INT NUM = 1;. // 상품을 구별하는 데 사용 
    개인  정적 제품 제품 = 새로운 새 제품 ();
     개인 ArrayList의를 < 문자열> = goodList 새로운 새로운 ArrayList를 <> ();   // 사용 문자열의 새로운 클래스를 생성 너무 게으른, 물품을 나타냅니다. . . 

    { 
        옵션 ( INT I = 0; I ++는, I (20)는 < ) { 
            addGood () 
        } 
    } 
    // 초기 20 개 물품 첨가 생성자 

    개인 물품 () { 
    } 

    공개  정적 제품의 getInstance () {
         반환 제품을; 
    } 

    // 화물 생산 
    공공  동기화 된 문자열 addGood () {   // 사용 동기화 잠금 방법을, 그래서 구현은 출시 후 제품 개체, 고정되면,이 메서드를 호출. 

        goodList.add ( "화물"+ NUM) 
        NUM ++ ;
         반환 "제품"+ NUM은; // 제품 생산 이름을 반환 
    } 

    // 화물 소비 
    대중  동기화 된 문자열 removeGood에게 () {
         IF (goodList.size ()> 0 ) { 
            문자열 S = goodList.remove (0 )
             리턴 S; //이 소비재의 이름을 반환; 
        }
         다른 {
             은 try {
                 // 대기가 상품의 스레드가 아니라 스레드 (소비자 만 해당)이 방법이 방법의 구현을 호출 현재 객체 
                에서 System.out.println을 ( "그것은 발견 된 제품이"+ NUM + "품절이, 그래서 거기에서 이동하지 않는 경우" ); 

                // this.notifyAll ()를 추가하지;의 경우 :
                 // 이 문장의 실행을 발견 4 회 (생산자>의 소비자 지출 속도가 속도를 생산하기 때문에 생산이 매진에, 충분한 시간), 4 개 소비자는 생산에 두 생산자 여전히 물건을 구입하지 않았다.
                // 가사 상태 : 프로그램 카드는 더 이상로 알려진, 여기에 계속하지 않습니다.
                // 스레드가 대기 상태에 들어갈 때, 가사를 방지하기 위해 다른 스레드를 깨워.
                // 

                // 알림 
                이 본 .notifyAll을 ();   //---- 문구를 추가 한 후, 스레드가 제대로 완료 할 수 있습니다. 일부 소비자 재고를 확인 후, 시간이 지남에 (그가 깨어 있도록 다른 소비자가 품절 있음) 구매를 통해 다시 시도합니다
                .wait (); 
            } 캐치 (예외 전자) { 
                e.printStackTrace (); 
            } 
            반환  널 (null)을 ; 
        } 
    } 


}

 

 

 

추천

출처www.cnblogs.com/clamp7724/p/11649719.html