Java 延迟队列中延迟后的轮询

Java 延迟队列中延迟后的轮询,java,polling,blockingqueue,Java,Polling,Blockingqueue,我有一个示例程序,试图从中理解延迟队列。我向队列提供具有特定延迟的person对象,当我在间隔5秒后尝试轮询这些对象时,我应该获取延迟在此之前已过期的所有对象。但是我得到的是空值,我不理解其原因。但当我将延迟设置为0时,此轮询有效。有人能帮我找出我在下面的示例代码中犯了什么错误吗 public class DelayedQueue { public static void main(String[] args) { BlockingQueue<Person>

我有一个示例程序,试图从中理解延迟队列。我向队列提供具有特定延迟的person对象,当我在间隔5秒后尝试轮询这些对象时,我应该获取延迟在此之前已过期的所有对象。但是我得到的是空值,我不理解其原因。但当我将延迟设置为0时,此轮询有效。有人能帮我找出我在下面的示例代码中犯了什么错误吗

public class DelayedQueue {
    public static void main(String[] args) {
        BlockingQueue<Person> queue = new DelayQueue<Person>();
        Person a = new Person("ram", "chennai", 1);
        Person b = new Person("nick", "manali", 1);
        Person c = new Person("sam", "delhi", 2);
        try {
            queue.offer(a);
            queue.offer(b);
            queue.offer(c);
            System.out.println(queue.poll(5, TimeUnit.SECONDS));
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}

class Person implements Delayed {
    private String name;
    private String place;
    private int runningTime;

    public Person(String name, String place, int runningTime) {
        this.name = name;
        this.place = place;
        this.runningTime = runningTime;
    }
    public long getDelay(TimeUnit timeUnit) {           
        return timeUnit.convert(this.runningTime, TimeUnit.MILLISECONDS);

    @Override
    public int compareTo(Delayed person) {
        Person b = (Person)person;   
        return this.name.compareTo(b.name);
    }

    @Override
    public long getDelay(TimeUnit timeUnit) {           
        return timeUnit.convert(this.runningTime, TimeUnit.MILLISECONDS);
    }
}
公共类延迟队列{
公共静态void main(字符串[]args){
BlockingQueue=new DelayQueue();
人员a=新人员(“拉姆”、“钦奈”,1);
人员b=新人员(“尼克”、“马纳利”,1);
人员c=新人(“山姆”、“德里”,2);
试一试{
排队。报价(a);
排队。报价(b);
3.报价(c);
System.out.println(queue.poll(5,TimeUnit.SECONDS));
}捕捉(中断异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
}
}
类的人实现延迟{
私有字符串名称;
私人弦乐场;
私有int运行时;
公共人物(字符串名称、字符串位置、int运行时间){
this.name=名称;
这个地方=地方;
this.runningTime=运行时间;
}
公共长getDelay(时间单位时间单位){
返回timeUnit.convert(this.runningTime,timeUnit.millizes);
@凌驾
公共内部比较(延迟人员){
b人=(人)人;
返回此.name.compareTo(b.name);
}
@凌驾
公共长getDelay(时间单位时间单位){
返回timeUnit.convert(this.runningTime,timeUnit.millizes);
}
}

您的getDelay实现错误

@Override
    public long getDelay(TimeUnit timeUnit) {       
        **// This will never return zero! and the element is never available.**
        return timeUnit.convert(this.runningTime, TimeUnit.MILLISECONDS);
    }
试着做这样的事情

@Override
    public long getDelay(TimeUnit timeUnit) {           
        return timeUnit.convert(endOfDelay - System.currentTimeMillis(),
                          TimeUnit.MILLISECONDS);
    }
其中endOfDelay设置为long(System.currentTimeMillis()+延迟(毫秒)

以下是您代码的工作部分:

public class DelayedQueue
{
    public static void main(String[] args)
    {
        BlockingQueue<Person> queue = new DelayQueue<Person>();
        Person a = new Person("ram", "chennai", 1);
        Person b = new Person("nick", "manali", 1);
        Person c = new Person("sam", "delhi", 2);
        try
        {
            queue.offer(a);
            queue.offer(b);
            queue.offer(c);
            System.out.println(queue.poll(2, TimeUnit.SECONDS));
        } catch (InterruptedException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}
class Person implements Delayed
{
    private String name;
    private String place;
    private long delayTime;

    public Person(String name, String place, long delayTime)
    {
        this.name = name;
        this.place = place;
        this.delayTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(delayTime);
    }

    @Override
    public int compareTo(Delayed person)
    {
        Person b = (Person) person;
        return this.name.compareTo(b.name);
    }

    @Override
    public long getDelay(TimeUnit timeUnit)
    {
        return timeUnit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }
}
公共类延迟队列
{
公共静态void main(字符串[]args)
{
BlockingQueue=new DelayQueue();
人员a=新人员(“拉姆”、“钦奈”,1);
人员b=新人员(“尼克”、“马纳利”,1);
人员c=新人(“山姆”、“德里”,2);
尝试
{
排队。报价(a);
排队。报价(b);
3.报价(c);
System.out.println(queue.poll(2,TimeUnit.SECONDS));
}捕捉(中断异常e1)
{
//TODO自动生成的捕捉块
e1.printStackTrace();
}
}
}
类的人实现延迟
{
私有字符串名称;
私人弦乐场;
私生活时间长;
公众人物(字符串名称、字符串位置、长延迟时间)
{
this.name=名称;
这个地方=地方;
this.delayTime=System.currentTimeMillis()+TimeUnit.SECONDS.toMillis(延迟时间);
}
@凌驾
公共内部比较(延迟人员)
{
b人=(人)人;
返回此.name.compareTo(b.name);
}
@凌驾
公共长getDelay(时间单位时间单位)
{
返回timeUnit.convert(delayTime-System.currentTimeMillis(),timeUnit.mills);
}
}

我在javadocs中看到“队列的头是延迟时间过去最长的延迟元素”。但我没有得到使用poll检索到的最短过期元素。因此,根据上面的程序,当我执行queue.poll(2,TimeUnit.SECONDS)时我不能得到元素ram,但得到的是nick,而且当我更改延迟时,我总是得到nick。你能解释一下为什么poll()的这种行为是随机的吗?这是因为你定义的比较。正因为如此,nick是峰值元素。因此,如果延迟,它总是拉nick