Collection集合中的Buffer

当我们需要一种缓冲区来暂存数据的时候,我们就考虑用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