DelayQueue 대기열 상세 정보
5350 단어 java 병렬 프로그래밍
개술
DelayQueue
는 java.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출처: 약서 약서의 저작권은 작가의 소유이며, 그 어떠한 형식의 전재도 작가에게 연락하여 권한을 수여받고 출처를 밝혀 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
DelayQueue 대기열 상세 정보DelayQueue는 java.util.concurrent에서 제공한 재미있는 종류이다.본고는 DelayQueue에 대해 소개한 다음에 응용 장면을 열거할 것이다.또한 Delayed 인터페이스 구현과 Sample 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.