并发queue的简单介绍(二)

xiaoxiao2021-02-28  83

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(); } } }
转载请注明原文地址: https://www.6miu.com/read-34252.html

最新回复(0)