재미 자바 멀티 스레딩 (기다렸다가의 notifyAll 올바른 사용 자세) 재미 자바 멀티 스레드 https://www.cnblogs.com/haibiscuit/p/11094348.html을 (탁구 대회)

재현, 블로그의 주소를 알려주십시오

당신이 별의 내 GitHub의 프로젝트 AioSocket 점에 제발 도와 주면 나는, github의 계정 사회 공헌의 의욕을 블로그와

코드를 노크 누가, 키가 간단하고 이해하고 모든 프로그래머가 할 수없는 코드를 유지 보수가 용이하지만 좋은 성능을 노크, 키는 구덩이를 많이 피하기 위해, 좋은 자세를 찾는 것입니다.

예, 오늘의 이야기가 기다려 올바른 사용 자세의 notifyAll입니다. (이전에 따라 재미 자바 멀티 스레딩 (탁구 대회) https://www.cnblogs.com/haibiscuit/p/11094348.html )

코드를 게시하기 전에, 우선은 절차 규칙의 논리에 대해 얘기 :

        1.6 스레드 실행 + 3 개 동작의 스레드 실행 (3)의 실 - 수술 및 동시 스레드 요구의 동기화를 보장 할

        2. 각 스레드 루프 N 배의 동작은, 기본적으로 (20)

        3. 수행 + 20 개 운전 데이터를 초과하지 않음 - 운전 데이터가 될 수없는 경우는 0보다 작은

 

코드를 게시 :

패키지 스레드;

수입 java.util.concurrent.CountDownLatch;

/ **
* 대기 방법과 엔티티 클래스의 객체에 쓰기의 방법 통보
*는 전자를 방출하는 다른 스레드에 의해 호출, 운영 엔티티 객체를 종료 기다릴 잠금이 일시적으로 현재 스레드의 작업에서 철수 해제, 객체의 방법을 알리기 위해 현재 스레드를 나타냅니다 실 물체 계속 작동
* /
공용 클래스 AwaitTest {
공공 정적 무효 메인 (문자열 []에 args)
{
CountDownLatch를 CountDownLatch를 CountDownLatch를 새로운 = 새. (6)
numberHolder numberHolder 새로운 새 numberHolder = ()

스레드 = T1 새로운 새 IncreaseThread (numberHolder을 CountDownLatch를)
스레드 T2 = 새로운 새 DecreaseThread (numberHolder, CountDownLatch를)

스레드 T3 = 새로운 새 IncreaseThread (numberHolder, CountDownLatch를)
스레드 T4 = 새로운 새 DecreaseThread (numberHolder, CountDownLatch를)

스레드 T5 = 새로운 새 IncreaseThread (numberHolder, CountDownLatch를)
스레드 T6 = 새로운 DecreaseThread (numberHolder, CountDownLatch를);


t1.start ();
t2.start ();

t3.start ();
t4.start ();

t5.start ();
t6.start ();


{은 try의
CountDownLatch.await ();
에서 System.out.println ( "실행의 주 스레드의 끝!");
} 캐치 (예외 : InterruptedException E) {
해야할 일 자동 생성 된 블록 // 캐치
e.printStackTrace ();
}

}

}


NumberHolder 클래스
{// ********** 매우 중요한
개인 INT 번호; // 횟수의 수를 증가 실행하고 여기에 동일한의 감소를 수행하기 위해
그렇지 않으면 스레드가하지 않는 대기 상태에있다가 발생할 수 있습니다 // 다음과 같이 변경하면서 IF
개인 INT의 I; // 실행 플래그의 횟수, 테스트 클래스 CountDownLatch를

) (동기화 무효 공개 늘리기
{
그동안을 현재 스레드 오브젝트가 대기 상태에 진입 할 때 // 현재 수는 10 (번호 20 ==이다)
{
은 try
{
; this.wait (500)
}
캐치 (예외 : InterruptedException E)
{
E .printStackTrace ();
}
}

// 본원 행할 수 기재된 깨우되어야
// 수이고 0
번호 ++]
에서 System.out.println ( "실행 횟수"+ (I ++))
에서 System.out.println (번호);

// 스레드를 대기 통보
this.notifyAll ();
}

) (동기화 무효 공개 감소
{
(0 번호 ==) // 현재 오브젝트의 개수가 대기 상태에 들어가는 제로인되는 동안
{
은 try
{
; this.wait (500)
}
캐치 (예외 : InterruptedException E)
{
) (e.printStackTrace을 ;
}

}

//는 본원에 기재된 깨우되어야 행할 수
// 숫자는 0이 아닌
숫자]
에서 System.out.println ( "실행 횟수"+ (I ++))
에서 System.out.println (번호)
은이. 의 notifyAll ();
}

}
// 스레드 클래스 다음 데이터 클래스 제어 개체 추가
클래스는 스레드 확장 IncreaseThread
{
, 개인 NumberHolder numberHolder
개인 CountDownLatch를 해, CountDownLatch를;

공개 IncreaseThread (NumberHolder numberHolder, CountDownLatch를 CountDownLatch를)
{
this.numberHolder = numberHolder;
this.countDownLatch = CountDownLatch를;
}

@Override
공공 무효 RUN ()
{
에 대한 (나는 20이 <나는 = 0 int로 내가 ++)
{
// 특정 지연
은 try
{
에 Thread.sleep ((롱) 인 Math.random () * 1000);
}
캐치 (예외 : InterruptedException E)
{
e.printStackTrace ();
}

// 작업이 증가 수행

numberHolder.increase ();
}
countDownLatch.countDown ();
}

}
// 스레드 클래스는 작업 엔티티 클래스 완료
클래스는 스레드 확장 DecreaseThread
{
, 개인 NumberHolder numberHolder
CountDownLatch를 해, CountDownLatch를 개인을,

공공 DecreaseThread (NumberHolder numberHolder하는 CountDownLatch를 CountDownLatch를)
{
this.numberHolder = numberHolder;
this.countDownLatch = CountDownLatch를;
}

@Override
공공 무효 RUN ()
{
에 대한 (나는 20이 <나는 = 0 int로 내가 ++)
{
// 특정 지연
은 try
{
에 Thread.sleep ((롱) 인 Math.random () * 1000);
}
캐치 (예외 : InterruptedException E)
{
e.printStackTrace ();
}

// 감소 동작 수행
)을 numberHolder.decrease (
}
)를 countDownLatch.countDown (
}

}

 

요약 :

       더 제한이 결합하면서 사용해야 할 경우, 생체 방법으로 동기화 1.wait하려면 (함께 사용하지 않는 것이 좋습니다 경우)

       2.notifyAll () 메소드는 동기화 된 방법 내에서 사용될 필요가있다 (바람직하지 통지 방법)

 

추천

출처www.cnblogs.com/haibiscuit/p/11097578.html