天天看点

队列学习之DelayedQueue

延时队列DelayedQueue是一种无界的阻塞队列,内置的元素对象要实现Delayed接口,并重写getDelayed和compared方法,该方法会将插入的对象按设置的时间延时执行。

下面用我们平时去网吧上网的例子来说明该队列的使用场景及方法:

1.声明一个网民类,该类实现Delayed接口

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
//我们在这里先声明一个Delayed对象
public class Visitor implements Delayed{

    private String name;
    //身份证
    private String id;
    //截止时间
    private long endTime;
    //定义时间工具类
    private TimeUnit timeUnit = TimeUnit.SECONDS;

    public Visitor(String name,String id,long endTime){
        this.name = name;
        this.id = id;
        this.endTime = endTime;
    }

    public String getName(){
        return this.name;
    }

    public String getId(){
        return this.id;
    }

    /**
     * 判断是否到了截止时间
     */
    @Override
    public long getDelay(TimeUnit unit) {
        // TODO Auto-generated method stub
        return endTime - System.currentTimeMillis();
    }

    @Override
    public int compareTo(Delayed o) {
        Visitor vistor = (Visitor)o;
        return this.getDelay(this.timeUnit) - vistor.getDelay(this.timeUnit)>0?1:0;
    }
}           

2.声明一个网吧类,该类实现Runnable接口,并加入上机下机的方法

import java.util.concurrent.DelayQueue;

public class NetBar implements Runnable{
    private DelayQueue<Visitor> queue = new DelayQueue<Visitor>();

    private Boolean operate = true;


    public void PlayOn(String name,String id,int money){
        Visitor visitor = new Visitor(name,id,1000*money+System.currentTimeMillis());
        System.out.println("网名"+visitor.getName()+" 身份证"+visitor.getId()+" 充值"+money+"块,开始上机");
        this.queue.add(visitor);
    }


    public void PlayOff(Visitor visitor){
        System.out.println("网名"+visitor.getName()+"身份证"+visitor.getId()+"时间到,自动下机");
    }




    @Override
    public void run() {
        while(operate){
            try{
                Visitor visitor = queue.take();
                PlayOff(visitor);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args) {
        try{
            System.out.println("netbar开始营业");
            NetBar netBar = new NetBar();
            Thread t1 = new Thread(netBar);
            t1.start();
            netBar.PlayOn("张三", "122121", 5);
            netBar.PlayOn("李四", "444553", 10);
            netBar.PlayOn("王五", "2221223", 15);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}           

执行结果:

netbar开始营业
网名张三 身份证122121 充值5块,开始上机
网名李四 身份证444553 充值10块,开始上机
网名王五 身份证2221223 充值15块,开始上机
网名张三身份证122121时间到,自动下机
网名李四身份证444553时间到,自动下机
网名王五身份证2221223时间到,自动下机