DelayQueue 대기열 상세 정보

개술

DelayQueuejava.util.concurrent에서 제공한 재미있는 종류이다.본고는 DelayQueue에 대해 소개한 다음에 응용 장면을 열거할 것이다.또한 Delayed 인터페이스 구현과 Sample 코드를 제공합니다.DelayQueue는 무계BlockingQueue로 인터페이스를 실현한 대상을 배치하는데 그 중의 대상은 기한이 되어야만 대기열에서 가져갈 수 있다.이런 대열은 질서정연하다. 즉, 대열 대상의 기한이 가장 길다는 것이다.주의:null 요소를 이 대기열에 놓을 수 없습니다.
지연 시간이 주어진 후에 실행해야 할 대상을 표시하는 혼합 스타일의 인터페이스Delayed는 Delayed 인터페이스를 확장했고 비교 기준은 시간 지연 값이며 Comparable 인터페이스의 실현 클래스 getDelay의 반환 값은 고정 값(Delayed이어야 한다.final 내부는 사용DelayQueue으로 이루어졌다.

응용 예

PriorityQueue 차단 대기열은 우리 시스템 개발에서도 자주 사용된다. 예를 들어 캐시 시스템의 디자인, 캐시 중의 대상은 여가 시간을 초과하여 캐시에서 옮겨야 한다.임무 스케줄링 시스템은 임무의 집행 시간을 정확하게 파악할 수 있다.우리는 많은 시간 동안 엄격한 데이터를 처리해야 할 수도 있다. 만약에 일반적인 데이터를 사용한다면 우리는 모든 대상을 두루 훑어보고 데이터가 기한이 지났는지 하나하나 검사해야 한다. 첫째, 이렇게 하면 집행의 효율이 높지 않을 것이다. 둘째, 이런 디자인의 스타일도 데이터의 정밀도에 큰 영향을 주었다.12:00시에 실행해야 하는 작업은 12:01에 실행될 수 있으며, 이렇게 하면 데이터에 대한 요구가 높은 시스템에 더욱 큰 폐단이 생길 수 있다.이로써 우리는 사용할 수 있다DelayQueue.
우리는 PC방이나 PC방에서 인터넷을 할 때 하나의 PC방 종합 시스템을 사용한다. 그 중에서 하나의 주요 기능은 모든 네티즌에게 시간을 재는 것이다. 사용자가 일정 금액을 충전하면 해당하는 인터넷을 할 때 우리는 DelayQueue 시뮬레이션으로 실현한다.DelayQueue로 네티즌DelayQueue류를 저장하고 모든 수험생이 자신의 이름과 시험지를 완성하는 시간Wangmin을 가지고 Wangba라인DelayQueue을 감시하며 대기열에서 시간을 꺼낸 네티즌이 다음 조작을 한다.Delayed 인터페이스를 실현한 네티즌류
public class Wangmin implements Delayed {  

    private String name;  
    //   
    private String id;  
    //   
    private long endTime;  
    // 
    private TimeUnit timeUnit = TimeUnit.SECONDS;
      
    public Wangmin(String name,String id,long endTime){  
        this.name=name;  
        this.id=id;  
        this.endTime = endTime;  
    }  
      
    public String getName(){  
        return this.name;  
    }  
      
    public String getId(){  
        return this.id;  
    }  
      
    /** 
     *   
     */  
    @Override  
    public long getDelay(TimeUnit unit) { 
        //return unit.convert(endTime, TimeUnit.MILLISECONDS) - unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        return endTime - System.currentTimeMillis();
    }  
  
    /** 
     *   
     */  
    @Override  
    public int compareTo(Delayed delayed) {  
        Wangmin w = (Wangmin)delayed;  
        return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0;  
    }    
}

PC방류
public class WangBa implements Runnable {  

    private DelayQueue queue = new DelayQueue();  
    
    public boolean yingye =true;  
    
    /**
     *   
     */
    public void shangji(String name,String id,int money){  
        Wangmin man = new Wangmin(name, id, 1000 * money + System.currentTimeMillis());  
        System.out.println(" "+man.getName()+"  "+man.getId()+" "+money+" , ...");  
        this.queue.add(man);  
    }  
    
    //  
    public void xiaji(Wangmin man){  
        System.out.println(" "+man.getName()+"  "+man.getId()+" ...");  
    }  
  
    @Override  
    public void run() {  
        while(yingye){  
            try {  
                Wangmin man = queue.take();  
                xiaji(man);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
    public static void main(String args[]){  
        try{  
            System.out.println(" ");  
            WangBa siyu = new WangBa();  
            Thread shangwang = new Thread(siyu);  
            shangwang.start();  
              
            siyu.shangji(" ", "123", 1);  
            siyu.shangji(" ", "234", 10);  
            siyu.shangji(" ", "345", 5);  
        }  
        catch(Exception e){  
            e.printStackTrace();
        }  
  
    }  
}

원본 코드 분석


먼저 DlayedQueue 원본 코드를 살펴보겠습니다.
public class DelayQueue extends AbstractQueue
implements BlockingQueue {

    private final transient ReentrantLock lock = new ReentrantLock();
    private final PriorityQueue q = new PriorityQueue();

    // ...

}

이것은 작은 부분의 원본이다. 이 원본을 통해 알 수 있듯이 DelayedQueue에서 처리하는 것은Delayed인터페이스를 실현하는 임무이고 DelayedQueue는lock을 사용하여 라인의 동기화를 실현하고PriorityQueue를 사용하여 임무를 관리한다.그러면 딜레이드 커넥터는 뭘까요?
public interface Delayed extends Comparable {

    long getDelay(TimeUnit unit);
}

이것은 Delayed 인터페이스의 공식 주석입니다. 이것은 혼합 스타일의 인터페이스로 지연된 작업을 만들기 위한 것입니다.(번역이 잘 되지 않으니 바로잡아 주세요).이 중 두 가지 중요한 방법은compareTo와 getDelay이다. 첫 번째는 두 작업의 지연 시간을 비교하여 정렬하는 것이고, 두 번째 방법은 지연 시간을 얻는 것이다.priorityQueue는 일종의 우선순위 대기열이다. 여기서 우선순위는 지연시간이다. 즉, 대기열에 들어간 작업의 설치 우선순위를 정렬하는 것이다. 지연시간이 가장 짧은 것은 대기열 앞에서 먼저 처리된다. 즉, 매번 대기열에서 꺼낸 작업은 기한이 된 임무가 된다.예를 들어 우리는 캐시를 실현하는데, 키-value가 기한을 초과하면 대기열 앞에서 꺼내서 소각 작업을 할 수 있다.
캐시를 구현하는 예는 다음과 같습니다.http://www.cnblogs.com/jobs/archive/2007/04/27/730255.html
작성자: algernoon 링크:https://www.jianshu.com/p/5b48180bafce출처: 약서 약서의 저작권은 작가의 소유이며, 그 어떠한 형식의 전재도 작가에게 연락하여 권한을 수여받고 출처를 밝혀 주십시오.

좋은 웹페이지 즐겨찾기