차단 대기열에 대해 읽었으며 특정 질문이 표시되었습니다. 내가 읽은 모든 예제는 오직 하나의 소비자와 하나의 제작자 스레드 만있는 상황을 보여줍니다. 질문은 : 우리가 1 명의 생산자와 3 명의 소비자를 가지고 있고 현재 모든 소비자가 take() 메소드로 불려지지만 대기열이 비어있어 모두가 첫 번째 요소를 나타 내기를 기다리고 있다고 가정합니다. 어떤 소비자 스레드가 나타날 때 첫 번째 요소를 사용합니까? take()를 먼저 호출 한 소비자 쓰레드?Java 대기열 차단
답변
표시 될 때 첫 번째 요소를 차지할 소비자 스레드는 무엇입니까? take()를 먼저 호출 한 소비자 쓰레드?
이는 블로킹 큐 구현뿐만 아니라 문제의 JVM하지만 짧은 대답이 가장 가능성이 그렇다 연결되어 있습니다. 각 스레드는 조건을 기다리고 대기 큐의 첫 번째 스레드는 조건이 신호를 받으면 시작됩니다.
즉, JVM 및 OS 버전뿐만 아니라 해당 블로킹 큐의 세부 사항에 크게 의존하기 때문에이 기능에 의존해서는 안됩니다.
내가 알 수 있는지는 잘 모르겠다. 진짜 질문은 : 당신은 왜 알 필요가 있는가? 모든 청취자는 동등해야합니다. 어떤 요청을 처리하는지는 중요하지 않습니다. 알고 있어야하는 경우 잘못 설계하고 구현했습니다.
check ArrayBlockingQueue(int capacity, boolean fair)
fair가 true이면 삽입 또는 제거시 차단 된 스레드에 대한 대기열 액세스가 FIFO 순서로 처리됩니다.
duffymo에 동의합니다. 큐에 몇 가지 새로운 요소가 무한정 대기하고 있다는 생각은 매우 잘 구조화 된 것 같습니다.
소비자가 어떤 요소를 제거했는지 알아야 할 필요가 있다면 소비자가 실제로 다른 일을하고 있다고 생각하게됩니다. 소비자의 주문에 따라 다른 시나리오에서 다른 작업에 생명을 불어 넣습니다. take()를 수행하십시오. 이 경우 다른 스레드에 대해 다른 큐가 필요할 수 있습니다.
코드를 변경하지 않으려는 경우 스레드가 정기적으로 설문 조사를 수행하는 것은 어떻습니까?
'대기열에 새로운 요소가 팝업되기 위해 무기한 대기하는 여러 스레드'는 허용되는 디자인 패턴이며 매우 일반적입니다. 그게 잘못이라고 생각하니? 나는 어떤 스레드가 어떤 작업을하는지 고려할 필요가 없다는 것에 동의한다. –
네 말이 맞아. 나는 다른 스레드가 팝업을 기다리는 이미지를 내 마음 속에 가지고 있었고, 이상하게 들리지는 않았지만 요소를 기다리는 스레드에는 아무 것도 보이지 않는다. 물론 소비자가하는 일은 실제로 요소를 소비하고 요소 자체의 처리를 수행하는 것입니다. – user1897690
이것은 구현에 따라 다르며, 어떤 경우에는 'ArrayBlockingQueue'와 같은 인수를 생성 할 때 인수에 따라 달라집니다. – Keppil
그러나 좋은 점은'ArrayBlockingQueue' 비 공정 모드에서도 기다리는 쓰레드의 큐가 있고'take()'를 호출 한 첫번째 큐는 대기열에서 빠져 나올 것입니다. – Gray
그럼 공정 모드에서는 어떻게 될까요? 그 차이점은 무엇입니까? –