当我们需要一种缓冲区来暂存数据的时候,我们就考虑用Buffer,或Queue。
常见的几种Buffer有:
UnboundedFifoBuffer
没有尺寸限制的先进先出队列
BoundedFifoBuffer
有尺寸限制的先进先出队列
PriorityBuffer
具有优先权的队列,构造函数传Comparator对象决定优先权。如果没有Comparator参数,则将每个对象强制转换成Comparable类型,并用CompareTo()比较对象
BlockingBuffer
阻塞式缓冲区,系统需要等待输入,并在某个对象加入缓冲区后马上处理它。
来个例子,先进先出的限制大小的队列:
Buffer buffer = new BoundedFifoBuffer(2); buffer.add(“A”); buffer.add(“B”); try { buffer.add(“C”); } catch (BufferOverflowException e) { System.out.println(e.getMessage()); }
再来个例子,具有优先级的队列:
Comparator chineseComparator = new ChineseComparator(); ComparatorChain comparatorChain = new ComparatorChain(); comparatorChain.addComparator(new BeanComparator(“company”, chineseComparator)); comparatorChain.addComparator(new BeanComparator(“name”, chineseComparator)); comparatorChain.addComparator(new BeanComparator(“sex”, chineseComparator)); Buffer buffer = new PriorityBuffer(comparatorChain); User user1 = new User(“马加爵”, “男”, “招商局”); User user2 = new User(“李刚”, “男”, “公安局”); User user3 = new User(“马加爵”, “女”, “招商局”); User user4 = new User(“李英”, “男”, “公安局”); User user5 = new User(“马加爵”, “男”, “公安局”); buffer.add(user1); buffer.add(user2); buffer.add(user3); buffer.add(user4); buffer.add(user5); while (buffer.size() > 0) { User user = (User) buffer.remove(); System.out.println(user.getName() + “|” + user.getSex() + “|” + user.getCompany()); }
结果如下:
李刚|男|公安局李英|男|公安局 马加爵|男|公安局 马加爵|男|招商局 马加爵|女|招商局
最后一个例子,阻塞式队列:
package com.guoweiwei.test.buffer;import org.apache.commons.collections.Buffer; public class BufferListener implements Runnable { private Buffer buffer; public BufferListener(Buffer buffer){ this.buffer = buffer; } public void run(){ while(true){ String message = (String)buffer.remove(); System.out.println(message); } } }
上面的是实现了Runnable的监听类,当buffer有输入的时候会打印出当前的buffer元素。
Buffer buffer = BlockingBuffer.decorate(new BoundedFifoBuffer()); BufferListener listener = new BufferListener(buffer); Thread listenerThread = new Thread(listener); listenerThread.start(); buffer.add(“hello”); buffer.add(“thanks”);
上面buffer对象是由BlockingBuffer装饰的BoundedFifoBuffer对象。将在buffer.add()时阻塞调用listenerThread的run()方法。 运行结果如下:
hellothanks