자바 에서 Delay Queue 인 스 턴 스 용법 상세 설명

3622 단어 자바DelayQueue
차단 팀 에서 요 소 를 추가 하고 삭제 하 는 것 을 제외 하고 우 리 는 요소 의 삭 제 를 지연 시 킬 수 있 습 니 다.즉,Delay Queue 를 사용 하 는 방법 입 니 다.이곳 의 삭 제 는 일정한 시간 이 걸 려 야 효력 이 발생 하 는데,약간 기한 이 지난 처리 이념 과 유사 하 다.다음은 Delay Queue 의 개념,특징 에 대해 설명 한 다음 에 코드 예제 에서 Delay Queue 의 사용 을 체험 합 니 다.
1.개념
지연 시간 이 있 는 무한 차단 대기 열 입 니 다.대기 열 에 있 는 요 소 는 지연 시간 이 되 어야 만 꺼 낼 수 있 습 니 다.이 대기 열 은 보통 만 료 된 데이터 의 삭제 나 작업 스케줄 링 에 사 용 됩 니 다.다음은 정 해진 데이터 삭 제 를 모 의 해 보 겠 습 니 다.
2.특징
(1)경계 없 는 디자인
(2)추가(put)차단 하지 않 음,차단 제거
(3)요 소 는 모두 만 료 시간 이 있다.
(4)원 소 를 꺼 내 는 것 은 기한 이 지난 것 만 꺼 낼 수 있다.
3.실례
DelayQueue 대기 열 요 소 를 넣 을 때마다 Delayed 인 터 페 이 스 를 실현 해 야 합 니 다.다음은 DelayObject 클래스 를 만 듭 니 다.인 스 턴 스 대상 은 DelayQueue 에 들 어 갑 니 다.그 구조 함 수 는 문자열 형식 데이터 와 밀리초 지연 변 수 를 포함한다.

public class DelayObject implements Delayed {
  private String data;
  private long startTime;
  public DelayObject(String data, long delayInMilliseconds) {
    this.data = data;
    this.startTime = System.currentTimeMillis() + delayInMilliseconds;
}
Delay Queue 의 응용 인 스 턴 스

package org.dromara.hmily.demo.springcloud.account.service;
 
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
 
/**
 * @description:       
 * @author: hh
 */
public class DelayedQueneTest {
 
  public static void main(String[] args) throws InterruptedException {
    Item item1 = new Item("item1", 5, TimeUnit.SECONDS);
    Item item2 = new Item("item2",10, TimeUnit.SECONDS);
    Item item3 = new Item("item3",15, TimeUnit.SECONDS);
    DelayQueue<Item> queue = new DelayQueue<>();
    queue.put(item1);
    queue.put(item2);
    queue.put(item3);
    System.out.println("begin time:" + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    for (int i = 0; i < 3; i++) {
      Item take = queue.take();
      System.out.format("name:{%s}, time:{%s}
",take.name, LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)); } } } class Item implements Delayed{ /* */ private long time; String name; public Item(String name, long time, TimeUnit unit) { this.name = name; this.time = System.currentTimeMillis() + (time > 0? unit.toMillis(time): 0); } @Override public long getDelay(TimeUnit unit) { return time - System.currentTimeMillis(); } @Override public int compareTo(Delayed o) { Item item = (Item) o; long diff = this.time - item.time; if (diff <= 0) {// >= return -1; }else { return 1; } } @Override public String toString() { return "Item{" + "time=" + time + ", name='" + name + '\'' + '}'; } }
실행 결과:5 초 마다 하나씩 꺼 내기

begin time:2019-05-31T11:58:24.445
name:{item1}, time:{2019-05-31T11:58:29.262}
name:{item2}, time:{2019-05-31T11:58:34.262}
name:{item3}, time:{2019-05-31T11:58:39.262}
자바 의 Delay Queue 인 스 턴 스 용법 에 대한 자세 한 설명 은 여기까지 입 니 다.자바 의 Delay Queue 가 어떤 내용 인지 에 대해 서 는 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기