2013-04-08 4 views
0

차단 대기열에 대해 읽었으며 특정 질문이 표시되었습니다. 내가 읽은 모든 예제는 오직 하나의 소비자와 하나의 제작자 스레드 만있는 상황을 보여줍니다. 질문은 : 우리가 1 명의 생산자와 3 명의 소비자를 가지고 있고 현재 모든 소비자가 take() 메소드로 불려지지만 대기열이 비어있어 모두가 첫 번째 요소를 나타 내기를 기다리고 있다고 가정합니다. 어떤 소비자 스레드가 나타날 때 첫 번째 요소를 사용합니까? take()를 먼저 호출 한 소비자 쓰레드?Java 대기열 차단

답변

1

표시 될 때 첫 번째 요소를 차지할 소비자 스레드는 무엇입니까? take()를 먼저 호출 한 소비자 쓰레드?

이는 블로킹 큐 구현뿐만 아니라 문제의 JVM하지만 짧은 대답이 가장 가능성이 그렇다 연결되어 있습니다. 각 스레드는 조건을 기다리고 대기 큐의 첫 번째 스레드는 조건이 신호를 받으면 시작됩니다.

즉, JVM 및 OS 버전뿐만 아니라 해당 블로킹 큐의 세부 사항에 크게 의존하기 때문에이 기능에 의존해서는 안됩니다.

+0

이것은 구현에 따라 다르며, 어떤 경우에는 'ArrayBlockingQueue'와 같은 인수를 생성 할 때 인수에 따라 달라집니다. – Keppil

+0

그러나 좋은 점은'ArrayBlockingQueue' 비 공정 모드에서도 기다리는 쓰레드의 큐가 있고'take()'를 호출 한 첫번째 큐는 대기열에서 빠져 나올 것입니다. – Gray

+0

그럼 공정 모드에서는 어떻게 될까요? 그 차이점은 무엇입니까? –

2

내가 알 수 있는지는 잘 모르겠다. 진짜 질문은 : 당신은 왜 알 필요가 있는가? 모든 청취자는 동등해야합니다. 어떤 요청을 처리하는지는 중요하지 않습니다. 알고 있어야하는 경우 잘못 설계하고 구현했습니다.

2

check ArrayBlockingQueue(int capacity, boolean fair) fair가 true이면 삽입 또는 제거시 차단 된 스레드에 대한 대기열 액세스가 FIFO 순서로 처리됩니다.

1

duffymo에 동의합니다. 큐에 몇 가지 새로운 요소가 무한정 대기하고 있다는 생각은 매우 잘 구조화 된 것 같습니다.

소비자가 어떤 요소를 제거했는지 알아야 할 필요가 있다면 소비자가 실제로 다른 일을하고 있다고 생각하게됩니다. 소비자의 주문에 따라 다른 시나리오에서 다른 작업에 생명을 불어 넣습니다. take()를 수행하십시오. 이 경우 다른 스레드에 대해 다른 큐가 필요할 수 있습니다.

코드를 변경하지 않으려는 경우 스레드가 정기적으로 설문 조사를 수행하는 것은 어떻습니까?

+0

'대기열에 새로운 요소가 팝업되기 위해 무기한 대기하는 여러 스레드'는 허용되는 디자인 패턴이며 매우 일반적입니다. 그게 잘못이라고 생각하니? 나는 어떤 스레드가 어떤 작업을하는지 고려할 필요가 없다는 것에 동의한다. –

+0

네 말이 맞아. 나는 다른 스레드가 팝업을 기다리는 이미지를 내 마음 속에 가지고 있었고, 이상하게 들리지는 않았지만 요소를 기다리는 스레드에는 아무 것도 보이지 않는다. 물론 소비자가하는 일은 실제로 요소를 소비하고 요소 자체의 처리를 수행하는 것입니다. – user1897690