java - 为什么我的延迟队列取不出数据了?
问题描述
我使用java的延迟队列来取数据,但是发现根本无法取出数据。
package com.test;import java.util.concurrent.Delayed;import java.util.concurrent.TimeUnit;public class SmsEntity implements Delayed { private final long WAIT_TIME = 10; private long startTime = System.currentTimeMillis(); private String phone; public SmsEntity(String phone) {this.phone = phone; } public String getPhone() {return phone; } public void setPhone(String phone) {this.phone = phone; } public long getStartTime() {return startTime; } public void setStartTime(long startTime) {this.startTime = startTime; } @Override public int compareTo(Delayed o) {SmsEntity entity = (SmsEntity) o;if (this.getStartTime() - entity.getStartTime() > 0) { return 1;}return -1; } @Override public long getDelay(TimeUnit unit) {//long waitTimeForGiveTimeUnit = unit.convert(WAIT_TIME, TimeUnit.MILLISECONDS);//long areadyLeftTime = unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS)//- unit.convert(startTime, TimeUnit.MILLISECONDS);//if (areadyLeftTime > waitTimeForGiveTimeUnit) {// return 0;//}//return unit.convert(waitTimeForGiveTimeUnit - areadyLeftTime, TimeUnit.MILLISECONDS);return 1; }}package com.test;import java.util.concurrent.DelayQueue;public class DelayQueueDemo { public static void main(String[] args) {DelayQueue<SmsEntity> queue=new DelayQueue<>();queue.put(new SmsEntity('1'));try {// Thread.sleep(3000); queue.put(new SmsEntity('2')); System.out.println(queue.take().getPhone()); System.out.println(queue.take().getPhone());} catch (InterruptedException e) { e.printStackTrace();} }}
结果是一直在阻塞。我想请教这是为什么,感觉自己调用的没有错啊
问题解答
回答1:getDelay()始终返回1,所以永远不会expire。
可以仔细研究一下DelayQueue的文档: https://docs.oracle.com/javas...
Expiration occurs when an element’s getDelay(TimeUnit.NANOSECONDS)method returns a value less than or equal to zero
相关文章:
1. docker安装后出现Cannot connect to the Docker daemon.2. nignx - docker内nginx 80端口被占用3. docker绑定了nginx端口 外部访问不到4. 如何解决docker宿主机无法访问容器中的服务?5. redis - 究竟是选择微信小程序自带的统计工具还是自己开发一个数据统计的代码?6. dockerfile - [docker build image失败- npm install]7. javascript - 怎么实现点击表格中的某一行然后就在表单处出现表格中的对应的属性值啊8. javascript - 修改表单多选项时和后台同事配合的问题。9. macos - mac下docker如何设置代理10. css - 使用blur()滤镜为什么有透明的效果

网公网安备