여러 독자를 지원할 수있는 대기열이 필요합니다
-
07-07-2019 - |
문제
여러 독자가 처리 할 수있는 대기열이 필요합니다.
독자는 요소를 삭제하여 휴식 서비스로 보냅니다.
주목해야 할 것은 다음과 같습니다.
- 각 독자는 다른 요소를 탈취해야합니다. 대기열에 요소 a, b & c가있는 경우, 스레드 1은 a를 탈취하고 스레드 2는 동시 방식으로 b를 탈취해야합니다. 그리고 줄에 아무것도 없을 때까지.
- 나는 항상 바쁜 루프에서 실행하는 것이 CPU 집중적이라는 것을 이해합니다. 따라서 차단 대기열이 좋은 옵션인지 확실하지 않습니다.
내 옵션은 무엇입니까?
해결책
동시에 린드 큐 또는 LinkedBlockingqueue 행동 차단을 원하는지 여부에 따라 즉시 떠오르는 두 가지 옵션입니다.
Adamski가 언급 한 것처럼 take()
방법의 방법 LinkedBlockingQueue
데이터가 도착하기를 기다리는 동안 CPU 사이클을 불필요하게 태우지 않습니다.
다른 팁
나는 당신의 질문에 따르면 스레드가 엄격한 라운드 로빈 방식으로 요소를 탈취 해야하는지 확실하지 않습니다. 이것이 당신이 사용할 수있는 제한이 아니라고 가정합니다 BlockingQueue
'에스 take()
메소드는 데이터를 사용할 수있을 때까지 스레드가 차단 될 수 있습니다 (따라서 CPU를 소비하지 않습니다 사이클).
또한 주목하십시오 take()
구현은 원자입니다 (예 : LinkedBlockingQueue
) : 여러 스레드가 차단 된 경우 take()
그리고 단일 요소가 queueed됩니다 단 하나 Thread 's Take () 호출이 반환됩니다. 다른 하나는 차단 될 것입니다.
ConcurrentLinkedqueue와 LinkedBlockingqueue의 주요 차이점은 처리량입니다. 보통 스레드 경합에서 동시 린드 큐는 다른 모든 블록 링크를 크게 수행합니다. 그러나 무거운 오화 하에서, 블록 킹크는 경합 스레드를 대기 스레드 세트에 적절하게 넣을 수 있으므로 약간 더 나은 선택입니다.