2012-04-23 2 views
3

세마포어를 사용하여 스레드 프로세스를 작성하고 있습니다.세마포어를 사용하여 다른 모든 스레드가 특정 횟수만큼 중요한 섹션을 실행할 때까지 스레드를 차단합니다.

K가 주어지면 모든 이전 스레드가 적어도 K-1 회 크리티컬 섹션에 들어 왔는지 확인할 수 있기를 원합니다. 그렇지 않은 경우, 현재 스레드는 이전 스레드가 그렇게 할 수있을 때까지 차단합니다.

예 : K = 3으로 설정하면 현재 스레드가 임계 구역에 들어가기를 원할 때 모든 이전 스레드가 임계 구역 K-1 (이 경우에는 두 번)에 들어갔는지 확인해야합니다 중요한 섹션을 입력하십시오

누구든지 자바에서 이것을 구현할 수있는 방법을 알고 있습니까? 미리 감사드립니다.

+0

미리 스레드 수를 알고 있습니까? – Gray

+0

이것은 'K'의 모든 값에 적용됩니까? 따라서 모든 스레드가 실행되기 전에 모든 스레드가 한 번 실행되어야합니다. – Gray

+0

예 스레드 수를 – NuNu

답변

6

자바 7을 사용하고 있는지 확인하고 Phaser을 사용하십시오. Phaser는이를 K-1 단계가 될 때까지 즉시 수행합니다. 여기

은 예입니다
int waitForPhase = K-1; 
ExecutorService e = Executors.newFixedThreadPool(n); 
Phaser phaser = new Phaser(n); 
for(int i=0; i< n ;i++){ 
    e.submit(new Runnable(){ 
     public void run(){ 
      for(j =0 ;j < waitForPhase ; j++){ 
       //do work 
       phaser.arriveAndAwaitAdvance(); 
       // if you do not want all sub threads to wait for each 
       // this can also be phaser.arrive() 
      } 
     } 
    }); 
} 
phaser.awaitAdvance(waitForPhase); 

그래서이 시작하면 페이저에서 n 등록 된 자 할 때. 매번 한 스레드 arriveAndAwaitAdvance은 모든 스레드가 해당 장벽에 도달 할 때까지 대기합니다. 모든 스레드가 해당 장벽에 도달하면 단계가 증가합니다. 단계가 K-1에 도달하면 호출하는 스레드가 중단됩니다. phaser.awaitAdvance(waitForPhase); 마지막 문 후

은 만족

이전 스레드가 너무

편집 할 수 있었다 때까지

현재 스레드를 차단 할 :

awaitAdvance(int phase)가 현재 스레드를 일시 중단합니다 페이저의 현재 단계가 인수로 전달 된 단계가 될 때까지 모든 스레드가 도착하고 현재 스레드에서 전달 된 단계 번호가 증가하면 깨우기 위해 신호를받습니다.

+0

이 좋습니다. 거기에 Phaser를 사용하지 않고 그것을 할 수 있습니다. 전에 Phaser를 사용하지 않았기 때문에 나는 그것에 익숙하지 않습니다. – NuNu

+0

CyclicBarrier를 사용할 수는 있지만 '위상'을 스스로 제어해야합니다. –

+0

phaser.awaitAdvance (waitForPhase)에 대한 질문 : 그 문장을 풀어주는 문장입니까, 정확히 무엇을 의미합니까? – NuNu

관련 문제