자바에서 동기화를 연구 중입니다. 나는 CountDownLatch의 정확한 메커니즘을 이해할 수 없다.CountDownLatch는 Java에서 어떻게 작동합니까?
CountDownLatch 은 선언시 주어진 스레드 수에 따라 (스레드 수 완료를 기다리는) 래치를 카운트 다운합니까? (스레드 풀에서)
7 스레드가 ExecutorService에 의해 산란된다 : 위의 예에서
public class LatchExample implements Runnable {
private CountDownLatch latch;
private int id;
public LatchExample(int id, CountDownLatch latch){
this.id=id;
this.latch = latch;
}
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(5);
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 7; i++) {
executor.submit(new LatchExample(i,latch));
}
try {
latch.await();
System.out.println("all process completed");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
}
@Override
public void run() {
System.out.println("Starting: "+id);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}
}
: 여기
내가 이해하려고 노력 코드입니다.CountDownLatch latch = new CountDownLatch(5);
하지만 얻을 출력이 일정 할 때마다되지 않습니다 : 나의 이해에 의해 정의 된 래치 (0 ~ 5) (6 개) 스레드가 완료 될 때까지 기다립니다해야한다는 것입니다.
Starting: 0
Starting: 2
Starting: 1
Starting: 4
Starting: 5
Starting: 3
all process completed
Starting: 6
편집 : :이 CountDownLatch를 이상적으로 카운트 다운이 5 개 작업이를 전달해야 할 때까지
다음Starting: 1
Starting: 0
Starting: 2
Starting: 3
Starting: 5
Starting: 4
Starting: 6
all process completed
다른 시간에 출력은 : 6 스레드가 완료 될 때까지 때로는 7 예를 대기 위해 때때로 기다립니다 걸쇠. 여기에 6 또는 7 중 하나로 표시됩니다. '모든 프로세스가 완료되었습니다' 전에 항상 5 개의 작업 만 표시하려면 코드의 수정 내용은 무엇입니까?
왜 'CountDownLatch'가 5가 아닌 7입니까? [CountDownLatch] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)의 java 문서에있는 예제에서'N'을보십시오 – Jack
@Jack 만약 내가 단 5 ~ 6 개의 스레드 만 완료되기를 기다리고 싶습니까? 그래서 이유가 있습니다. – Anurag
그럼 제대로 작동합니다. 한 번에 둘 이상의 스레드가 실행될 수 있기 때문에 경쟁 조건이 있습니다 ... Executors.newFixedThreadPool (3); ' – Jack