자바 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)
가 현재 스레드를 일시 중단합니다 페이저의 현재 단계가 인수로 전달 된 단계가 될 때까지 모든 스레드가 도착하고 현재 스레드에서 전달 된 단계 번호가 증가하면 깨우기 위해 신호를받습니다.
미리 스레드 수를 알고 있습니까? – Gray
이것은 'K'의 모든 값에 적용됩니까? 따라서 모든 스레드가 실행되기 전에 모든 스레드가 한 번 실행되어야합니다. – Gray
예 스레드 수를 – NuNu