并发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(); } }}
阅读全文
0 0
- 并发queue的简单介绍(二)
- 并发queue的简单介绍(一)
- (C#)使用队列(Queue)解决简单的并发问题
- 使用队列(Queue)解决简单的并发问题
- Linux TCP 服务器编程(二):简单的并发服务器
- Golang教程:(二十)并发介绍
- okhttp的简单介绍(二)之简单封装
- okhttp的简单介绍(二)之简单封装
- 二、计算机系统的简单介绍
- 简单的Queue
- CRM简单介绍(二)
- WebService简单介绍(二)
- 关于使用ETL工具Kettle的简单介绍(二)
- android uiautomator学习(二)主要类的简单介绍
- android uiautomator学习(二)主要类的简单介绍
- android uiautomator学习(二)主要类的简单介绍 .
- WebSocket入门教程(二)-- WebSocket简单的API介绍
- Runtime的介绍与简单运用(二)
- geoserver切片出现HTTP ERROR 403解决
- 有效回文串
- DAG的一些性质
- Windows 安装Bazel (安装过程中报远程服务器错,先记下来方法)
- A
- 并发queue的简单介绍(二)
- OGG 字符转换问题
- solr 6.3 安装配置 入门(一)
- python3+xlrd解析Excel
- 亦舒《我的前半生》
- 选择排序和堆排序
- 文章标题
- 数据结构小结——链表
- PYTHON机器学习实战——逻辑回归