Java BlockingQueue와 동일한 데이터 구조에 관심이 있습니다. 단, 큐의 객체를 일괄 처리 할 수 있어야한다는 점이 다릅니다. 즉, 생산자가 객체를 대기열에 넣을 수 있지만 대기열이 특정 크기 (배치 크기)에 도달 할 때까지 소비자 블록을 take()
에 두는 것이 좋습니다.Java BlockingQueue with batching?
큐가 배치 크기에 도달하면 생산자는 대기열의 모든 요소를 소비 할 때까지 put()
을 차단해야합니다. 생산자가 생산을 다시 시작하고 소비자 블록이 배치까지 다시 도달 함).
비슷한 데이터 구조가 존재합니까? 또는 나는 그것을 써야 하는가 (나는 상관하지 않는다), 나는 거기에 뭔가가 있다면 내 시간을 낭비하고 싶지 않다.
UPDATE 아마 것들을 조금 명확하게 다음과 같이
상황은 항상있을 것입니다. 여러 생산자가 대기열에 항목을 추가 할 수 있지만 하나 이상의 소비자가 대기열에서 항목을 가져 오지는 않습니다.
이제 병렬 및 직렬로 이러한 설정이 여러 개 있습니다. 즉, 생산자는 여러 대기열에 대한 항목을 생산하지만, 자신의 권리를 지닌 소비자도 생산자가 될 수 있습니다. 이것은 생산자, 소비자 생산자 및 최종 소비자의 감독 그래프로보다 쉽게 생각할 수 있습니다.
대기열이 비어있을 때까지 생산자가 차단해야하는 이유는 (@Peter Lawrey) 각각이 스레드에서 실행되기 때문입니다. 공간을 사용할 수있게되면 단순히 생성하도록 남겨두면 너무 많은 스레드를 한꺼번에 처리하려고하는 상황이 발생하게됩니다.
아마도 이것을 실행 서비스와 결합하면 문제가 해결 될 수 있습니까?
소비자가 바쁠 때 생산자를 차단하고 싶습니다. –
재미있게, 대부분의 시스템은 이것을 피하기 위해 아주 오래갑니다. ;) 두 번째 제안은 정확히 수행 할 것입니다. 제작자를 차단하지 않으려면 왜 여러 스레드를 사용하고 있습니까? "프로듀서"가 프로세서/소비자 일뿐만 아니라 동시에 실행하고 싶지 않은 경우에도 더 간단하지 않습니다. –
내 업데이트를 참조하십시오. 설계는 생산자가 너무 블록되어 실행중인 스레드의 수가 적게 유지되어야합니다. 또한 생산자와 소비자 간의 의존성 문제를 해결합니다. –