전송할 메시지가 포함 된 BlockingQueues가 여러 개 있습니다. 대기열보다 적은 수의 소비자가있을 수 있습니까? 대기열을 반복하고 (대기중인) 폴링을 유지하고 모든 대기열에 대해 스레드를 원하지 않습니다. 대신, 어떤 대기열에서 메시지를 사용할 수있을 때 깨어 난 스레드를 하나 갖고 싶습니다.다중 차단 대기열, 단일 사용자
12
A
답변
6
당신이 할 수있는 한 가지 트릭은 대기열을 대기열로 만드는 것입니다. 따라서 모든 스레드가 구독하는 단일 차단 대기열을 사용하면됩니다. 그런 다음 BlockingQueues 중 하나에 항목을 대기열에 추가하면 차단 대기열도이 단일 대기열에 대기열에 포함됩니다. 그래서 당신은 같은 것이다 :
BlockingQueue<WorkItem> producers[] = new BlockingQueue<WorkItem>[NUM_PRODUCERS];
BlockingQueue<BlockingQueue<WorkItem>> producerProducer = new BlockingQueue<BlockingQueue<WorkItem>>();
을 다음 새 작업 항목을받을 때
void addWorkItem(int queueIndex, WorkItem workItem) {
assert queueIndex >= 0 && queueIndex < NUM_PRODUCERS : "Pick a valid number";
//Note: You may want to make the two operations a single atomic operation
producers[queueIndex].add(workItem);
producerProducer.add(producers[queueIndex]);
}
이제 소비자 수있는 producerProducer의 모든 블록. 이 전략이 얼마나 가치가 있을지 모르지만 원하는대로 성취합니다.
4
LinkedBlockingMultiQueue은 사용자가 원하는 것을 수행합니다. 소비자가 임의의 BlockingQueues를 차단할 수는 없지만 단일 "다중 대기열"에서 "하위 대기열"을 만들고 동일한 효과를 얻을 수 있습니다. 생산자가 하위 대기열에서 제공하고 소비자는 단일 다중 대기열을 폴링하여 모든 요소를 기다리는 것을 차단할 수 있습니다.
또한 다른 요소를 고려하기 전에 일부 큐에서 요소를 가져 오는 우선 순위를 지원합니다.
예 :
LinkedBlockingMultiQueue<Int, String> q = new LinkedBlockingMultiQueue<>();
q.addSubQueue(1 /* key */, 10 /* priority */);
q.addSubQueue(2 /* key */, 10 /* priority */);
LinkedBlockingMultiQueue<Int, String>.SubQueue sq1 = q.getSubQueue(1);
LinkedBlockingMultiQueue<Int, String>.SubQueue sq2 = q.getSubQueue(2);
그런 다음 당신이 제공 할 수 있습니다 및 설문 조사 :
sq1.offer("x1");
q.poll(); // "x1"
sq2.offer("x2");
q.poll(); // "x2"
면책 조항 : 나는 도서관의 저자입니다.
관련 문제
- 1. 다중 생산자 단일 소비자 대기열
- 2. 비 차단 대기열
- 3. 비 차단 대기열 테스트
- 4. 단일 사용자 Github 다중 시스템
- 5. 다중 스레드는 대기열 계약의 일부입니까?
- 6. C++ - 스레드 및 다중 대기열
- 7. jQuery의 다중 대기열
- 8. 소비자 필터링을 사용하는 생산자 - 소비자 차단 대기열
- 9. 콘텐츠 공급자는 단일 차단 인스턴스입니까?
- 10. Ninject - 다중 바인딩 해상도 차단
- 11. PHP에서 다중 단일 사용자 로그인 처리
- 12. 다중 사용자 환경을위한 단일 리소스 액세스
- 13. C에서 다중 스레드 대기열 제거
- 14. C# - 대기열 및 다중 스레드
- 15. 단일 응용 프로그램, 다중 사용자, 다중 데이터베이스 디자인
- 16. 다중 생성자, 단일 소비자
- 17. Unity 차단 - 사용자 지정 차단 동작
- 18. 자동 차단 기능을 사용하는 사용자 차단
- 19. Alexa 사용자 차단
- 20. 스맥에서 사용자 차단
- 21. 단일 사용자 라이선스 - Minitab
- 22. 단일 네트워크 - 다중 출력 또는 다중 네트워크 - 단일 출력?
- 23. 서비스 브로커 - 외부 대기열과 단일 대기열 비교
- 24. 단일 사용자 단일 로그인
- 25. 단일 또는 다중 목록
- 26. 다중 참조 - 단일 인스턴스
- 27. 단일 활동에서 다중 목록보기
- 28. 단일 열의 다중 뷰
- 29. 단일 테이블에 다중 삽입
- 30. 단일 프로세스에서 다중 appdomain
여러 생성자에게 제공되는 단일 차단 대기열과의 차이점은 무엇입니까? –
Alex가 달성하기를 원하는 것은 다중 차단 큐의 맨 위에 차단 대기열 (래퍼)을 만들어 소비자가 단일 차단 대기열에서 대기 할 수 있도록하는 것입니다. 아마도 Alex가 제작자에게 동일한 차단 대기열 인스턴스를 사용하도록 요구하는 것을 막을 수 있습니다. – sjlee
문제는 내가 큐당 여러 소비자를 원하지 않는다는 것입니다. 모든 큐를 하나의 큐에 덤프하면 소비자는 같은 큐에서 먹을 수 있습니다. 그래서 A가있는 대기열이 있고 B가있는 대기열이 있습니다. 다른 B가 아직 취해지고있는 한 B는 취해질 수 없습니다. – Alex