DelayQueue의 실제 사용


18

DelayQueue 의 실제 사용은 무엇이고, 어떤 일반적인 문제가 해결되도록 설계 되었습니까?

답변:


8

최근에 속도 제한을 위해 지연 대기열을 사용했습니다.

초당 X 개의 이벤트를 제한하려면 각 이벤트를 1 초 지연된 지연 큐에 배치하십시오.

delayQueue에 X 이벤트가있는 경우 큐에서 가져옵니다 (최소 1 개가 만료 될 때까지 차단). 이렇게하면 장기 제한을 초과하지 않고 단기 버스트를 허용 할 수 있습니다.


10

이 클래스는 여러 지연된 이벤트를 적절한 순서로 처리하려는 스레드에 적합합니다.

예를 들어 100 개의 깜박이는 표시등이 있고 모든 표시등이 서로 관련없는 다른 속도로 깜박이는 경우를 가정 해보십시오. 각 라이트마다 스레드를 만들거나이 클래스를 사용하여 하나의 스레드 좌표를 만들 수 있습니다. 다음과 같이 작동합니다.

  • Light플래시 속도 로 수업을 받다
  • Delayed빛을 가리키는 인터페이스 의 구현을 만듭니다.LightFlash
  • 조명의 플래시 속도에 적합한 지연 설정으로 각 조명에 대해 DelayQueueLightFlash조명을 만들고 새 조명을 추가하십시오.
  • 고리:

DelayQueue는 다음 이벤트 처리를 처리합니다.

내가 생각할 수있는 두 가지 실제 예 :

  • 각 연결에 대한 연결 핑과 같이 특정 시간 작업을 수행해야하는 (다중 스레드가 아닌) 서버.
  • setInterval ()setTimeout ()으로 작성된 임의의 수의 시간 초과 이벤트를 처리해야하는 Javascript 사용 브라우저의 구현입니다 . 아, 그리고 애니메이션 GIF.

DelayQueue아마도 우선 순위 대기열 로 구현 될 것이며 , 일반적으로 으로 가장 잘 구현됩니다 .


3

주요 사용법은 for Timer 클래스와 같은 작업 타이머입니다.

시스템 클럭에서 지연을 독립적으로 만들 수 있다면 (아직 확실하지는 않지만) "5 틱 후 X로 이동 한 후"와 같은 게임 이벤트에 사용할 수 있습니다 (그렇지 않으면 클럭 지터가 신뢰할 수 없게 만듭니다)


2

지연은 큐 자체가 아닌 큐에있는 요소와 연관됩니다. 큐에 들어가는 일부 오브젝트는 지연이 0 일 수 있지만 일부 오브젝트는 지연이 더 길 수 있습니다.

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html

이를 염두에두고 몇 가지 사용 사례를 생각할 수 있습니다. 메시징 흐름과 관련하여 취약하고 코드 냄새가 약간납니다. 특정 상황을 제외하고 모든 대안을 사용합니다.

1) 제어 흐름-주문을 처리하는 데 60 초가 걸리므로 개체가 60 초 이상있을 때까지 다음 번 주문을 읽지 마십시오.

2) 메시지 흐름-요청이 2 개 또는 3 개의 외부 서비스로 전송 된 후 첫 번째 일괄 작업이 완료 될 가능성이 있음 을 알게 된 후 N 초 후에 주문을 처리하기 위해 다음 작업을 릴리스하는 비동기 시스템 .

3) 메시지 일괄 처리-특정 유형의 주문이 폭주 할 수 있으므로 마지막 N 초 동안 수신 된 주문을 처리하지 않도록하여 비슷한 주문이 곧 발생하여 다음 실행시 일괄 처리로 처리 될 수 있는지 확인할 수 있습니다.

4) 메시지 우선 순위-다른 메시지 또는 다른 고객은 지연이 적거나 제로로 약간 높은 서비스 품질을 얻을 수 있습니다.


1

경우에 따라 대기열에 배치 한 객체는 대기열에서 대기하기 전에 일정 시간 동안 해당 대기열에 있어야합니다. 여기서는 BlockingQueue 인터페이스를 구현하는 java.util.concurrent.DelayQueue 클래스를 사용합니다. DelayQueue를 사용하려면 대기열 오브젝트가 지정된 시간 동안 대기열에 상주해야합니다.

실제 사용 예 는 devx 사이트에서 기사 작성을 참조하십시오.

...이 사실을 설명하려고 생각한 실제 사례는 머핀과 관련이 있습니다. 자, 머핀 객체 (우리가 자바를 말하는 것처럼 커피 찌르는 의도는 없습니다). 머핀 객체를 배치 할 DelayQueue가 있다고 가정 해 봅시다. getDelay 메소드는 본질적으로 객체가 DelayQueue에 유지되는 시간이 얼마나 남아 있는지를 나타냅니다. 이 메소드에 의해 돌려 주어지는 수가 제로 또는 제로보다 작은 경우, 객체는 준비되고 (이 예에서는 소성) 큐에서 제외됩니다.

완전히 요리되지 않은 머핀을 먹고 싶지 않기 때문에 권장 요리 시간 동안 머핀을 DelayQueue에 놓으십시오 ...


1
나는 그것이 무엇을하는지 이해하지만 그것이 해결하기 위해 설계된 일반적인 문제는 아니지만 유스 케이스를 찾고 있습니다.
Eran Medan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.