jdk里面的解释是:
* An unbounded {@linkplain BlockingQueue blocking queue} of
* {@code Delayed} elements, in which an element can only be taken
* when its delay has expired. The head of the queue is that
* {@code Delayed} element whose delay expired furthest in the
* past. If no delay has expired there is no head and {@code poll}
* will return {@code null}. Expiration occurs when an element's
* {@code getDelay(TimeUnit.NANOSECONDS)} method returns a value less
* than or equal to zero. Even though unexpired elements cannot be
* removed using {@code take} or {@code poll}, they are otherwise
* treated as normal elements. For example, the {@code size} method
* returns the count of both expired and unexpired elements.
* This queue does not permit null elements.
*
* This class and its iterator implement all of the
* optional methods of the {@link Collection} and {@link
* Iterator} interfaces. The Iterator provided in method {@link
* #iterator()} is not guaranteed to traverse the elements of
* the DelayQueue in any particular order.
大概说: delayQueue是一个无界的带延迟的阻塞队列, 在delayQueue里元素,只有延迟时间过期后才可以被取出来.
队列的顶端的元素是延迟时间最长的. 如果没有延迟,头部就没有元素, poll的结果也就是null; 延迟的判断是根据 “delayed”元素对象 调用 getDelay(TimeUnit.NANOSECONDS) 的方法返回值是否小于或者等于0; 虽然未到期的元素不能通过take 或者 poll 删除, 但是仍然可以当做普通元素对象对待. 例如: size()方法返回所有元素的和(无论是否到期的元素). delayQueue不允许空元素. 添加null的元素将有NullpointException 抛出.
delayQueue它的迭代器,并没有按特定的顺序规则排序遍历.
delayQueue 可以使用在很多的并发,带有延迟操作的工作中,也可以用在特殊的生产者-消费者模式上
import java.util.Random;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class DelayTaskTester {
private DelayQueue delayQueue = new DelayQueue();
public static void main(String args[]) {
DelayTaskTester tester = new DelayTaskTester();
ExecutorService executorService = Executors.newFixedThreadPool(2, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});
executorService.submit(tester.new DelayTaskCustomer());
executorService.submit(tester.new DelayTaskCustomer());
Random random = new Random();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
tester.delayQueue.offer(new DelayTask(random.nextInt(20 * 1000), startTime));
}
try {
Thread.sleep(21 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();
}
class DelayTaskCustomer implements Runnable {
@Override
public void run() {
while (true) {
try {
DelayTask delayTask = delayQueue.take();
delayTask.print();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
}
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayTask implements Delayed {
//
private final long timeStamp;
// 记录开始时间
private final long startTime;
private final long delayTime;
public DelayTask (final long delayTime, final long startTime) {
this.delayTime = delayTime;
this.timeStamp = System.currentTimeMillis();
this.startTime = startTime;
}
public long getExpectTime() {
return timeStamp + delayTime;
}
@Override
public int compareTo(Delayed o) {
if (this.getExpectTime() > ((DelayTask) o).getExpectTime()) {
return 1;
} else if (this.getExpectTime() < ((DelayTask) o).getExpectTime()) {
return -1;
}
return 0;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert((this.timeStamp + delayTime) - System.currentTimeMillis(), TimeUnit.NANOSECONDS);
}
/*
*/
public void print() {
long now = System.currentTimeMillis();
long realDelayTime = now - this.timeStamp;
long Deviation = realDelayTime - this.delayTime;
System.out.println(Thread.currentThread().getName() +"--延迟时间是:"
+ this.delayTime +"..真实延迟时间.......:" + realDelayTime + "......误差时间(单位毫秒)..::" +
Deviation + "此时完成任务时间共经历时间: " + (now - startTime));
}
}
pool-1-thread-1--延迟时间是:610..真实延迟时间.......:610......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 610
pool-1-thread-2--延迟时间是:1000..真实延迟时间.......:1001......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 1001
pool-1-thread-1--延迟时间是:1115..真实延迟时间.......:1127......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 1127
pool-1-thread-1--延迟时间是:1146..真实延迟时间.......:1158......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 1158
pool-1-thread-1--延迟时间是:1150..真实延迟时间.......:1158......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 1158
pool-1-thread-1--延迟时间是:1170..真实延迟时间.......:1174......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 1174
pool-1-thread-1--延迟时间是:1307..真实延迟时间.......:1314......误差时间(单位毫秒)..::7此时完成任务时间共经历时间: 1314
pool-1-thread-2--延迟时间是:1505..真实延迟时间.......:1518......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 1518
pool-1-thread-2--延迟时间是:1630..真实延迟时间.......:1644......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 1644
pool-1-thread-2--延迟时间是:2084..真实延迟时间.......:2096......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 2096
pool-1-thread-2--延迟时间是:2155..真实延迟时间.......:2160......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 2160
pool-1-thread-2--延迟时间是:2432..真实延迟时间.......:2442......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 2442
pool-1-thread-1--延迟时间是:2557..真实延迟时间.......:2567......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 2567
pool-1-thread-1--延迟时间是:2605..真实延迟时间.......:2614......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 2614
pool-1-thread-2--延迟时间是:2681..真实延迟时间.......:2692......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 2692
pool-1-thread-2--延迟时间是:2721..真实延迟时间.......:2723......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 2723
pool-1-thread-2--延迟时间是:2913..真实延迟时间.......:2927......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 2927
pool-1-thread-1--延迟时间是:3058..真实延迟时间.......:3067......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 3067
pool-1-thread-1--延迟时间是:3273..真实延迟时间.......:3287......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 3287
pool-1-thread-1--延迟时间是:3567..真实延迟时间.......:3568......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 3568
pool-1-thread-1--延迟时间是:3747..真实延迟时间.......:3757......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 3757
pool-1-thread-1--延迟时间是:4367..真实延迟时间.......:4367......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 4367
pool-1-thread-2--延迟时间是:4815..真实延迟时间.......:4821......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 4821
pool-1-thread-2--延迟时间是:4826..真实延迟时间.......:4853......误差时间(单位毫秒)..::27此时完成任务时间共经历时间: 4853
pool-1-thread-1--延迟时间是:4963..真实延迟时间.......:4977......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 4977
pool-1-thread-1--延迟时间是:5050..真实延迟时间.......:5055......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 5055
pool-1-thread-1--延迟时间是:5069..真实延迟时间.......:5071......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 5071
pool-1-thread-2--延迟时间是:5192..真实延迟时间.......:5197......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 5197
pool-1-thread-2--延迟时间是:5794..真实延迟时间.......:5806......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 5806
pool-1-thread-1--延迟时间是:5881..真实延迟时间.......:5886......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 5886
pool-1-thread-1--延迟时间是:6318..真实延迟时间.......:6324......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 6324
pool-1-thread-1--延迟时间是:6410..真实延迟时间.......:6418......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 6418
pool-1-thread-1--延迟时间是:6415..真实延迟时间.......:6418......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 6418
pool-1-thread-2--延迟时间是:6584..真实延迟时间.......:6589......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 6589
pool-1-thread-1--延迟时间是:7040..真实延迟时间.......:7044......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 7044
pool-1-thread-2--延迟时间是:7090..真实延迟时间.......:7091......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 7091
pool-1-thread-1--延迟时间是:7126..真实延迟时间.......:7138......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 7138
pool-1-thread-1--延迟时间是:7535..真实延迟时间.......:7545......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 7545
pool-1-thread-1--延迟时间是:7649..真实延迟时间.......:7655......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 7655
pool-1-thread-1--延迟时间是:8097..真实延迟时间.......:8109......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 8109
pool-1-thread-2--延迟时间是:8478..真实延迟时间.......:8487......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 8487
pool-1-thread-1--延迟时间是:8747..真实延迟时间.......:8752......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 8752
pool-1-thread-2--延迟时间是:8832..真实延迟时间.......:8846......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 8846
pool-1-thread-2--延迟时间是:8876..真实延迟时间.......:8878......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 8878
pool-1-thread-2--延迟时间是:9088..真实延迟时间.......:9096......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 9096
pool-1-thread-2--延迟时间是:9211..真实延迟时间.......:9222......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 9222
pool-1-thread-2--延迟时间是:9648..真实延迟时间.......:9661......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 9661
pool-1-thread-2--延迟时间是:10020..真实延迟时间.......:10021......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 10021
pool-1-thread-2--延迟时间是:10198..真实延迟时间.......:10208......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 10208
pool-1-thread-1--延迟时间是:10630..真实延迟时间.......:10631......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 10631
pool-1-thread-1--延迟时间是:11155..真实延迟时间.......:11163......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 11163
pool-1-thread-1--延迟时间是:11244..真实延迟时间.......:11257......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 11257
pool-1-thread-1--延迟时间是:11357..真实延迟时间.......:11367......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 11367
pool-1-thread-1--延迟时间是:11459..真实延迟时间.......:11461......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 11461
pool-1-thread-1--延迟时间是:11468..真实延迟时间.......:11476......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 11476
pool-1-thread-1--延迟时间是:11719..真实延迟时间.......:11726......误差时间(单位毫秒)..::7此时完成任务时间共经历时间: 11726
pool-1-thread-1--延迟时间是:11722..真实延迟时间.......:11726......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 11726
pool-1-thread-2--延迟时间是:11820..真实延迟时间.......:11821......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 11821
pool-1-thread-1--延迟时间是:11906..真实延迟时间.......:11915......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 11915
pool-1-thread-1--延迟时间是:12208..真实延迟时间.......:12213......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 12213
pool-1-thread-2--延迟时间是:12404..真实延迟时间.......:12415......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 12415
pool-1-thread-1--延迟时间是:12727..真实延迟时间.......:12728......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 12728
pool-1-thread-2--延迟时间是:12955..真实延迟时间.......:12964......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 12964
pool-1-thread-1--延迟时间是:13201..真实延迟时间.......:13214......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 13214
pool-1-thread-1--延迟时间是:13440..真实延迟时间.......:13449......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 13449
pool-1-thread-1--延迟时间是:13788..真实延迟时间.......:13793......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 13793
pool-1-thread-2--延迟时间是:13814..真实延迟时间.......:13824......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 13824
pool-1-thread-2--延迟时间是:14016..真实延迟时间.......:14028......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 14028
pool-1-thread-1--延迟时间是:14191..真实延迟时间.......:14201......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 14201
pool-1-thread-2--延迟时间是:14265..真实延迟时间.......:14279......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 14279
pool-1-thread-1--延迟时间是:14422..真实延迟时间.......:14436......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 14436
pool-1-thread-1--延迟时间是:14525..真实延迟时间.......:14529......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 14529
pool-1-thread-1--延迟时间是:14669..真实延迟时间.......:14670......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 14670
pool-1-thread-1--延迟时间是:14718..真实延迟时间.......:14732......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 14732
pool-1-thread-1--延迟时间是:14886..真实延迟时间.......:14889......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 14889
pool-1-thread-1--延迟时间是:14929..真实延迟时间.......:14937......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 14937
pool-1-thread-1--延迟时间是:15041..真实延迟时间.......:15046......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 15046
pool-1-thread-1--延迟时间是:15330..真实延迟时间.......:15344......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 15344
pool-1-thread-1--延迟时间是:15362..真实延迟时间.......:15375......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 15375
pool-1-thread-1--延迟时间是:15812..真实延迟时间.......:15813......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 15813
pool-1-thread-1--延迟时间是:16022..真实延迟时间.......:16032......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 16032
pool-1-thread-2--延迟时间是:16056..真实延迟时间.......:16063......误差时间(单位毫秒)..::7此时完成任务时间共经历时间: 16063
pool-1-thread-2--延迟时间是:16095..真实延迟时间.......:16095......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 16095
pool-1-thread-1--延迟时间是:16248..真实延迟时间.......:16251......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 16251
pool-1-thread-1--延迟时间是:16313..真实延迟时间.......:16314......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 16314
pool-1-thread-2--延迟时间是:16318..真实延迟时间.......:16329......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 16329
pool-1-thread-1--延迟时间是:16697..真实延迟时间.......:16706......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 16706
pool-1-thread-2--延迟时间是:16901..真实延迟时间.......:16909......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 16909
pool-1-thread-1--延迟时间是:17252..真实延迟时间.......:17253......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 17253
pool-1-thread-2--延迟时间是:17322..真实延迟时间.......:17332......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 17332
pool-1-thread-1--延迟时间是:17475..真实延迟时间.......:17489......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 17489
pool-1-thread-2--延迟时间是:17478..真实延迟时间.......:17489......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 17489
pool-1-thread-1--延迟时间是:17686..真实延迟时间.......:17692......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 17692
pool-1-thread-1--延迟时间是:17936..真实延迟时间.......:17942......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 17942
pool-1-thread-1--延迟时间是:17986..真实延迟时间.......:17989......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 17989
pool-1-thread-1--延迟时间是:18114..真实延迟时间.......:18114......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 18114
pool-1-thread-2--延迟时间是:18158..真实延迟时间.......:18162......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 18162
pool-1-thread-1--延迟时间是:18565..真实延迟时间.......:18567......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 18567
pool-1-thread-1--延迟时间是:18863..真实延迟时间.......:18867......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 18867
pool-1-thread-1--延迟时间是:19952..真实延迟时间.......:19952......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 19952