DelayQueue实现原理
概述
马老师多线程视频学习总结(好记性不如烂笔头)。CopyOnWriteArrayList学习使用。
DelayQueue使用
DelayQueue可以用来执行定时任务
package com.wz.code.test.thread.queue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayQueueTest {
// 可以用来执行定时任务
static BlockingQueue<MyTask> task = new DelayQueue<>();
static class MyTask implements Delayed {
long runningTime;
MyTask(long rt) {
this.runningTime= rt;
}
@Override
public int compareTo(Delayed o) {
if (this.getDelay(TimeUnit.MICROSECONDS) < o.getDelay(TimeUnit.MICROSECONDS))
return -1;
else if (this.getDelay(TimeUnit.MICROSECONDS) > o.getDelay(TimeUnit.MICROSECONDS))
return 1;
else
return 0;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(runningTime - System.currentTimeMillis(), TimeUnit.MICROSECONDS);
}
@Override
public String toString() {
return "" + runningTime;
}
}
public static void main(String[] args) throws InterruptedException {
long now = System.currentTimeMillis();
MyTask t1 = new MyTask(now + 1000);
MyTask t2 = new MyTask(now + 2000);
MyTask t3 = new MyTask(now + 1500);
MyTask t4 = new MyTask(now + 2500);
MyTask t5 = new MyTask(now + 500);
task.put(t1);
task.put(t2);
task.put(t3);
task.put(t4);
task.put(t5);
System.out.println(task);
for (int i = 0; i < 5; i++) {
System.out.println(task.take());
}
}
}