您的位置:首页 > 产品设计 > UI/UE

Java并发编程-32-带有延迟元素的队列-DelayQueue

2015-06-21 00:23 573 查看
一、DelayQueue

可以存放带有激活日期的元素,当调用方法从队列中返回或提取元素时,未来日期的元素将被忽略

package concurrencycollection;

import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class Event2 implements Delayed {

private Date startDate;

public Event2(Date startDate) {
this.startDate = startDate;
}

@Override
public int compareTo(Delayed o) {
// TODO Auto-generated method stub
long result = this.getDelay(TimeUnit.NANOSECONDS)
- o.getDelay(TimeUnit.NANOSECONDS);
if (result < 0)
return -1;
else if (result > 0)
return 1;
return 0;
}

/**
* 返回到激活日期的剩余时间,单位由参数指定
*/
@Override
public long getDelay(TimeUnit unit) {
// TODO Auto-generated method stub
Date nowDate = new Date();
long diff = startDate.getTime() - nowDate.getTime();
return unit.convert(diff, TimeUnit.MILLISECONDS);
}

}

package concurrencycollection;

import java.util.Date;
import java.util.concurrent.DelayQueue;

public class Task2 implements Runnable {

private int id;
private DelayQueue<Event2> delayQueue;

public Task2(int id, DelayQueue<Event2> delayQueue) {
this.id = id;
this.delayQueue = delayQueue;
}

@Override
public void run() {
Date nowDate = new Date();
Date delay = new Date();
delay.setTime(nowDate.getTime() + id * 1000);
System.out.println("Thread " + id + " " + delay);

for (int i = 0; i < 100; i++) {
Event2 event2 = new Event2(delay);
delayQueue.add(event2);
}
}
}

package concurrencycollection;

import java.util.Date;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.TimeUnit;

public class Main3 {

public static void main(String[] args) {
DelayQueue<Event2> delayQueue = new DelayQueue<Event2>();
Thread[] threads = new Thread[5];

for (int i = 0; i < threads.length; i++) {
Task2 task2 = new Task2(i + 1, delayQueue);
threads[i] = new Thread(task2);
}

for (int i = 0; i < threads.length; i++) {
threads[i].start();
}

for (int i = 0; i < threads.length; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

do {
int counter = 0;
Event2 event2;
do {
event2 = delayQueue.poll();
if (event2 != null)
counter++;
} while (event2 != null);
System.out.printf("At %s you have read %d events\n", new Date(),
counter);
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (delayQueue.size() > 0);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: