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.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); } }
相关文章推荐
- HDU 5273 Dylans loves sequence
- UIActionSheet的使用
- request操作的几个容易混淆的请求路径
- UICollectionView 的使用详解
- 【BC#24 1002 HDOJ 5273】Dylans loves sequence
- java queue 实战
- continue:结束本次循环,继续下一次循环
- AndroidStudio新建项目时一直处于building“xxx”gradle project info状态
- 隐藏指定的UIView区域
- 自己实现基于key-value的NoSQL数据库(三)—— B+树和Hash算法
- @requestparam怎么用
- 机房重构--UI设计与单例思考
- Java并发编程-31-阻塞式优先级列表-PriorityBlockingQueue
- hdu 5273 Dylans loves sequence
- HDU 5273 Dylans loves sequence(区间DP)
- UISegmentedControl的详细使用
- hdu 5273 Dylans loves sequence
- UVa1152 - 4 Values whose Sum is 0(hash)
- UVa1605 - Building for UN(构造)
- GitLab:解决Merge Request中Commits不更新的问题