一、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); } }