并发queue的简单介绍(二)

来源:互联网 发布:本地搜索引擎seo 编辑:程序博客网 时间:2024/06/10 14:05
PriorityBlockingQueue基于优先级的阻塞队列(优先级的判断通过构造函数传入的Compator对象来决定,也就是传入的对象必须实现Comparable接口),在实现
PriorityBlockingQueue时,内部线程同步锁采用的是公平锁,他也是个无界的对列。
测试代码
public static void main(String[] args) throws Exception{    PriorityBlockingQueue<Task> q = new PriorityBlockingQueue<Task>();    Task t1 = new Task();    t1.setId(3);    t1.setName("任务1");    Task t2 = new Task();    t2.setId(6);    t2.setName("任务2");    Task t3 = new Task();    t3.setId(1);    t3.setName("任务3");    q.add(t1);    q.add(t2);    q.add(t3);    System.out.println("=============>"+q.take().getId());    System.out.println("=============>"+q.take().getId());    System.out.println("=============>"+q.take().getId());}
DelayQueue带有延迟时间的Queue,其中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素.
DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时
数据进行移除、任务超时数据处理、空闲连接关闭等等.
测试案例
public class Wangmin implements Delayed {    private String name;    private String id;    //截止时间    private long endTime;    //定义时间工具类    private TimeUnit timeUnit = TimeUnit.SECONDS;    public Wangmin(String name, String id, long endTime) {        this.name = name;        this.id = id;        this.endTime = endTime;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public long getEndTime() {        return endTime;    }    public void setEndTime(long endTime) {        this.endTime = endTime;    }    @Override    public long getDelay(TimeUnit unit) {        return endTime-System.currentTimeMillis();    }    @Override    public int compareTo(Delayed o) {        Wangmin w=(Wangmin) o;        return this.getDelay(this.timeUnit)-w.getDelay(this.timeUnit)>0?1:0;    }}

public class Wangba implements Runnable {    private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>();    public boolean yingye = true;    public void shangji(String name,String id,int money){        Wangmin man = new Wangmin(name,id,1000*money+System.currentTimeMillis());        System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"交钱"+money+"块,开始上机...");        this.queue.add(man);    }    public void xiaji(Wangmin man){        System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"时间到下机...");    }    @Override    public void run() {        while (yingye){            try {                Wangmin man = queue.take();                xiaji(man);            }catch (InterruptedException e){                e.printStackTrace();            }        }    }    public static void main(String[] args) {        try {            System.out.println("网吧开始营业");            Wangba siyu = new Wangba();            Thread shangwang = new Thread(siyu);            shangwang.start();            siyu.shangji("路人甲", "123", 1);            siyu.shangji("路人乙", "234", 10);            siyu.shangji("路人丙", "345", 5);        }catch (Exception e){            e.printStackTrace();        }    }}


原创粉丝点击