【问题标题】:Proper way to work with FIFO buffer使用 FIFO 缓冲区的正确方法
【发布时间】:2012-06-17 17:44:46
【问题描述】:

我有这个 FIFO,我将用它来存储来自网络服务器的数据:

 Buffer nServerFifo = (Buffer) BufferUtils.synchronizedBuffer(new CircularFifoBuffer(200));

    // Insert into to the Network Server Buffer    
    public void nServerFifoAdd(String string){
        nServerFifo.add(string);        
    }

    // Get data from the Network Server Buffer
    public Object nServerFifoGet(){         
        Object string = nServerFifo.get();    
        nServerFifo.remove(string);
        return string;           
    }

我的问题是存储数据插入和从缓冲区获取数据的正确方法是什么?如果或这是由缓冲区完成的,我是否需要删除数据?你知道我可以存储到缓冲区中的最大字符串长度是多少吗?

【问题讨论】:

    标签: java apache-commons apache-commons-collection


    【解决方案1】:

    最好使用ArrayBlockingQueue class,它存在于java.util.concurrent 包中,它是线程安全的。

    BlockingQueue<String> queue = new ArrayBlockingQueue<String>(100);
    
    queue.put("Vivek");   // To insert value into Queue
    
    queue.take();         // To take the value out of Queue
    

    【讨论】:

    • ArrayBlockingQueue 和 CircularFIFOBuffer 有什么区别?哪个更快?
    • ArrayBlockingQueue 从 java 1.5 开始存在,可以做所有 CircularFIFOBuffer 所做的事情..
    • 当我得到带有queue.take(); 的字符串时,我需要用queue.remove("Vivek"); 删除队列元素还是自动完成?
    • 不,从队列中取出下一个元素并返回它。
    【解决方案2】:

    假设您使用的是 Commons Collections 中的类:

    1. 如果你使用remove()方法,你不需要额外删除任何东西
    2. 缓冲区存储对象引用,而不是字符串,因此它受分配的槽数的限制。在您的情况下,在缓冲区已满之前,您最多可以添加 200 个任意长度的字符串,受程序可用总内存的限制。

    正如 Kumar 指出的那样,您最好使用 Java 运行时库队列类,因为它们会为您处理同步,而 Commons Collections 类则要求您自己锁定迭代器。

    【讨论】:

    • 就我而言,我存储 XML。为此,您会推荐哪种缓冲区?
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2021-03-22
    • 1970-01-01
    • 2013-01-05
    • 2020-09-05
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多