2011-01-21 1 views
0

문제는 내가 스레드 A와 n 작업을해야한다는 것입니다. 스레드 A는이 작업이 완전히 끝날 때까지 기다려야합니다. 내 생각은 n 카운트로 CountDownLatch을 사용하고 생산자/소비자 패턴을 사용하여 작업자를 제어합니다.정확하게 수행 된 작업을 기다리십시오. 생산자, 소비자 및 카운터

AtomicInteger을 카운터로 사용합니다. 생산자가 카운터 값이 0보다 큰지 확인한 다음 BlockingQueue에 신호를 입력하고 카운터 값이 0보다 작거나 같으면 생산자가 stopSignal을 열. 소비자는 대기열에서 신호가 stopSignal과 같지 않은지 확인한 다음 ExecutorService을 사용하여 Worker을 예약합니다. 작업이 다음 완료되면 예 다음 작업, 을 할 경우

작업자 호출 getAndDecrement 및 카운터의 값이 0보다 큰 경우 확인, 그것은 다른 CountDownLatch를 번호의 카운트 다운이 문제가 incrementAndGet

와 카운터를 증가 호출 작업이 완료되지 않은 경우 작업자가 카운터를 늘려야하지만 getAndDecrement 이후이므로 생산자가 카운터 값을 0으로보고 작업 합계가 n보다 작아도 중지 신호를 보냅니다!

+0

정확하게 * n * 개의 스레드를 시작하고 모두'join() '할 수 없습니까? 어쩌면. – 9000

+0

n은 커질 수 있기 때문에 나는 말할 수 없다. – robinmag

답변

1

몇 가지 복잡한 문제 (정확히 n 개의 작업 완료를 기다리는 새로운 조건)와 함께 일반적인 제작자/소비자 문제에서 일하는 것처럼 들릴 수 있습니다. 정의한대로 제작자와 소비자가 있습니다. 하나는 일을하고 두 번째는 그것을 소모합니다.

작업이 생성 된 후에 증가합니다. 일이 끝나면 감량하는 것이 소모됩니다. 이 방법을 사용하면 작업자가 작업이있을 때만 대기열에서 가져 오려고합니다.

이제 문제를 해결하기 위해 n을 기다리는 새로운 조건이 완료되었습니다. 일정한 작업이 끝나기를 기다리고 있고 이러한 작업을 명확하게 알고 있다면 CyclicBarrier 개체를 사용하여 모든 작업이 장벽에 도달 할 때까지 흐름을 중지 할 수 있습니다.

동시 상황에서 두 가지 좌표 작업자가 일반적으로 더 많습니다. 프로듀서/소비자가이 문제의 해결책이 될 수는 없으며 장애물이 될 수도 없습니다. java.util.concurrent 패키지를 살펴 보는 것이 좋습니다.이 주제에 대해 더 많은 것을 밝힐 수 있습니다.

관련 문제