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

来源:互联网 发布:360网页广告拦截软件 编辑:程序博客网 时间:2024/06/05 05:12

一、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;}@Overridepublic int compareTo(Delayed o) {// TODO Auto-generated method stublong result = this.getDelay(TimeUnit.NANOSECONDS)- o.getDelay(TimeUnit.NANOSECONDS);if (result < 0)return -1;else if (result > 0)return 1;return 0;}/** * 返回到激活日期的剩余时间,单位由参数指定 */@Overridepublic long getDelay(TimeUnit unit) {// TODO Auto-generated method stubDate 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;}@Overridepublic 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);}}



0 0
原创粉丝点击