문제

여러 독자가 처리 할 수있는 대기열이 필요합니다.

독자는 요소를 삭제하여 휴식 서비스로 보냅니다.

주목해야 할 것은 다음과 같습니다.

  • 각 독자는 다른 요소를 탈취해야합니다. 대기열에 요소 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의 주요 차이점은 처리량입니다. 보통 스레드 경합에서 동시 린드 큐는 다른 모든 블록 링크를 크게 수행합니다. 그러나 무거운 오화 하에서, 블록 킹크는 경합 스레드를 대기 스레드 세트에 적절하게 넣을 수 있으므로 약간 더 나은 선택입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top