赞
踩
1、Queue
两套实现:ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论是哪种,都是继承了Queue
1、ConcurrentLinkedQueue
它是一个适合于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。它是基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。队列不允许null元素
ConcurrentLinkedQueue有2个重要的方法
add()、offer():增加元素,这个2个方法没什么区别
poll()、peek():从头部取元素、poll()会删除该节点,后者不会。
- //高性能无阻塞无界队列:ConcurrentLinkedQueue
-
- ConcurrentLinkedQueue<String> q = new ConcurrentLinkedQueue<String>();
- q.offer("a");
- q.offer("b");
- q.offer("c");
- q.offer("d");
- q.add("e");
-
- System.out.println(q.poll()); //a 从头部取出元素,并从队列里删除
- System.out.println(q.size()); //4
- System.out.println(q.peek()); //b
- System.out.println(q.size()); //4
2、BlockingQueue
2.1、ArrayBlockingQueue:基于数组的阻塞队列的实现,在ArrayBlockingQueue内部,维护了一个定长的数组,以便缓存队列中的数据对象,其内部没实现读写分离,也就意味着生产和消费不能完全并行,长度是需要定义的。可以指定先进先出或者先进后出,也叫有界队列,在很多场合下非常适合使用。
- ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5);
- array.put("a");
- array.put("b");
- array.add("c");
- array.add("d");
- array.add("e");
- array.add("f");
- //System.out.println(array.offer("a", 3, TimeUnit.SECONDS));
2.2、LinkedBlockingQueue:基于链表的阻塞队列,与ArrayBlockingQueue类似,其内部也是维持着一个数据的缓冲队列该队列(该队列有一个链表构成),LinkedBlockingQueue之所以能够高效的处理并发数据,是因为其内部实现采用分离锁(读写分离2个锁),从而实现生产者和消费者操作的完全并行运行,它是一个无界队列
- //阻塞队列
- LinkedBlockingQueue<String> q = new LinkedBlockingQueue<String>();
- q.offer("a");
- q.offer("b");
- q.offer("c");
- q.offer("d");
- q.offer("e");
- q.add("f");
2.3、SynchronousQueue:一种没有缓冲的队列,生产者产生的数据会直接被消费者获取并消费。该队列不允许添加任何元素
- final SynchronousQueue<String> q = new SynchronousQueue<String>();
- Thread t1 = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- System.out.println(q.take());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- t1.start();
- Thread t2 = new Thread(new Runnable() {
-
- @Override
- public void run() {
- q.add("asdasd");
- }
- });
- t2.start();
- }
2.4、PriorityBolckingQueue:基于优先级的阻塞队列(优先级的判断通过构造函数的传入Compator对象来决定,也就是说传入队列的对象必须实现Comparable接口),在实现PriorityBolckingQueue的时候,内部控制线程同步的锁采用公平锁,他也是一个无界的队列。
- public class Task implements Comparable<Task>{
-
- private int id ;
- private String name;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public int compareTo(Task task) {
- return this.id > task.id ? 1 : (this.id < task.id ? -1 : 0);
- }
-
- public String toString(){
- return this.id + "," + this.name;
- }
-
- }
- public class UsePriorityBlockingQueue {
-
- public static void main(String[] args) throws Exception {
-
- PriorityBlockingQueue<Task> q = new PriorityBlockingQueue<Task>();
-
- Task t1 = new Task();
- t1.setId(3);
- t1.setName("id为3");
- Task t2 = new Task();
- t2.setId(4);
- t2.setName("id为4");
- Task t3 = new Task();
- t3.setId(1);
- t3.setName("id为1");
-
- // return this.id > task.id ? 1 : 0;
- q.add(t1); // 3
- q.add(t2); // 4
- q.add(t3); // 1
-
- // 1 3 4
- System.out.println("容器:" + q);
- System.out.println(q.take().getId());
- System.out.println("容器:" + q);
- // System.out.println(q.take().getId());
- // System.out.println(q.take().getId());
-
- }
- }
2.5、DelayQueue:带有延迟时间的Queue,其中的元素只有但其指定的延迟时间到了,才能够从队列中获取到该元素,DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、任务超时处理、空闲连接的关闭等等。
- public class WangBa implements Runnable {
-
- private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>();
-
- public boolean yinye =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(yinye){
- 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();
- }
-
- }
- }
- 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 this.name;
- }
-
- public String getId(){
- return this.id;
- }
-
- /**
- * 用来判断是否到了截止时间
- */
- @Override
- public long getDelay(TimeUnit unit) {
- //return unit.convert(endTime, TimeUnit.MILLISECONDS) - unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
- return endTime - System.currentTimeMillis();
- }
-
- /**
- * 相互批较排序用
- */
- @Override
- public int compareTo(Delayed delayed) {
- Wangmin w = (Wangmin)delayed;
- return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。