使用java.util.List作为缓冲区是一种好方法吗?

时间:2013-08-22 17:46:40

标签: java list size

我有一个主要的进程和一个线程一起运行。 主进程接收所有传入的UDP消息并将其放入List。

然后该线程用于处理这些UDP消息。

然而,当我在线程

中尝试以下代码段时
int count = 0;
while(true)
{
    if (buffer.size()>count)
    {
        System.out.println("Processing "+buffer.get(count));
        count++;
    }
}

线程看起来效果不好。

顺便说一下, buffer

List<String> buffer = new ArrayList<String>();

并且它是主进程放置所有收到的UDP消息的地方

任何建议人员? : - )

5 个答案:

答案 0 :(得分:3)

没有。这是queue的经典目的,您可能希望实现BlockingQueue

答案 1 :(得分:2)

您的主题正在使用busy waiting,这解释了为什么它不能正常运行。当列表为空时,线程会消耗它可以使用的所有CPU资源。你想要相反:只要队列为空,线程就什么都不做。

有几种设计方法。基本行为称为the producer-consumer problem。在Java中实现它的最简单方法是使用BlockingQueue,尽管在基本的List上实现自己的等待/通知协议很容易。我相信维基百科的文章展示了如何用Java做到这一点。

答案 2 :(得分:1)

如果没有某种同步,以这种方式使用共享资源肯定不是一个好主意。我假设没有同步,因为我没有看到任何代码。

鉴于您拥有的代码,while循环永远不会终止,我只能想象缓冲区将在内存不足之前继续增长。

Java为您描述的实现提供了特定的数据结构。您可以考虑查看BlockingQueue

答案 3 :(得分:1)

如果要解析String协议,请改用队列。

如果要解析字节,请查看使用ByteBuffer,因为它的批量操作将更有效地进行缓冲。

在任何一种情况下,您都可能需要通过同步结构确保线程安全。

答案 4 :(得分:1)

首先,看起来你有一个语法错误的拼写错误(反++)。我假设你的意思是(计数++)。

问题的解决方案是Queue而不是列表。特别是,您需要将ConcurrentLinkedQueue用于此应用程序。