2011-10-08 5 views
4

take()method을 사용하여 BlockingQueue의 요소에 대해 스레드를 빠는 것이 중단 된 경우를 제외하고 요소를 사용할 수있을 때까지 기다리는 것을 이해합니다.성능 향상을 위해 BlockingQueue.take()에서 스레드를 명시 적으로 깨워 야합니까?

나는이 두 가지 질문 :

I)가 스레드가 자동으로 깨어 업 빨리 요소를 사용할 수있게하거나 지연 (즉, 스레드를 확인 후 자체가)이있는 한?

ii) 지연이있는 경우 스레드를 깨우는 것이 의미가 있습니까 (예 : 명시 적으로 중단하여)? 대기 시간과 성능에 대해 생각하고 있습니다.

답변

4

추가 지연이 없습니다. 요소가 사용 가능하거나 스레드가 인터럽트 된 경우 메소드 호출이 리턴합니다.

Retrieves and removes the head of this queue, waiting if necessary until an element becomes available. 

Returns: 
    the head of this queue 
Throws: 
    InterruptedException - if interrupted while waiting 

BlockinQueue

자동 (IMPL한다. ArrayBlockingQueue들)이하고있다.

// in add etc. 
notEmpty.signal(); 

// in take() 
while(count == 0) 
    notEmpty.await(); 
+0

@DownVoter : 의견을 남겨주세요. – MasterCassim

+0

나는 downvoter가 (아니, 나 아니야 :)라고 추측 할 수 있습니다. '지연이 없습니다'라는 것에 반대하고 있습니다. 일정 지연이있을 수 있습니다. 소비자 스레드는 제작자가 항목을 게시 할 때 준비가되지만 소비자보다 우선 순위가 높은 준비/실행 스레드 세트가 코어 수와 같거나 더 많은 요소를 갖는 경우 즉시 실행되지 않습니다. 어느 쪽이든, 인터럽트 또는 스레드와 같은 다른 동작은 아무 것도 변경하지 않습니다. 지연을 최소화하는 유일한 방법은 소비자가 충분히 높은 우선 순위를 유지하는지 확인하는 것입니다. 설명해 주셔서 감사합니다. –

+0

내가 속도를 올릴 수있는 추가적인 지연을 언급하고 있었기 때문에 나는 나의 대답을 편집했다. – MasterCassim