-1

시나리오 - 대기열에 메시지 개체가 있습니다. 큐가 폴링되고 메시지가 메시지 처리기로 전달됩니다. 메시지 검색 (폴링)은 클라이언트 로그인 이벤트 (하나 이상)에서 중지되어야합니다. Joshua Bloch의 조언에 따르면 동시 유틸리티의 출현과 함께 성가신 대기/통지 메커니즘을 사용할 이유는 거의 없습니다. 나는 어떤 싱크로 나이저 (세마포어, 사이 클릭 장벽, 카운트 다운 래치)가 나의 목적에 맞는지에 대한 선택을 할 수 없다. 어떤 충고라도 받아 들였다.Java 동기화 자

+3

정말 코드가 필요합니다. 어떤 종류의 대기열입니까? 예를 들어, [JMS 메시지 대기열] (http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html)을 참조 할 수 있습니다. 그러나 나는 생각하지 않습니다. – markspace

+0

@markspace 메시지는 JMS 대기열에서 가져 오지만 LinkedList (비동기 처리 용)에 배치됩니다. 지금 내가 언급 한 대기열은 LinkedList입니다. –

+0

JMS는 비동기 소비를 위해 설계되었습니다. JMS 대기열에서 메시지를 보내지 않는 이유는 무엇입니까? –

답변

1

해지가 즉시 필요하지 않은 경우 "독약"패턴을 사용할 수 있습니다. 사용자가 로그인하면 대기열에 특수한 "종료"객체를 배치합니다. 대기열을 폴링 할 때 해당 특수한 고유 한 객체가 있는지 확인하십시오. 예 :

public static final Message POISON_PILL = new Message(); 

... 

in your loop { 
    Message message = queue.take(); 
    if (message == POISON_PILL) // note usage of == here! 
     stopTheQueue(); 
    else 
     normalProcessing(message); 
} 

즉, 사용자가 로그인하기 전에 있던 모든 메시지가 대기열에서 처리됩니다. 이는 원하는 것일 수 있습니다.

정지가 즉각 일 필요가있는 경우 Thread.interrupted()As described here을 확인하십시오. 이를 위해서는 로그인 핸들러가 어느 스레드가 큐를 처리하고 커플 링을 증가시키는지를 알아야합니다. 그래서 "독약"은 결합력이 적어서 좋습니다.