我有一个主要的进程和一个线程一起运行。 主进程接收所有传入的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消息的地方
任何建议人员? : - )
答案 0 :(得分:3)
没有。这是queue的经典目的,您可能希望实现BlockingQueue
。
答案 1 :(得分:2)
您的主题正在使用busy waiting,这解释了为什么它不能正常运行。当列表为空时,线程会消耗它可以使用的所有CPU资源。你想要相反:只要队列为空,线程就什么都不做。
有几种设计方法。基本行为称为the producer-consumer problem。在Java中实现它的最简单方法是使用BlockingQueue
,尽管在基本的List
上实现自己的等待/通知协议很容易。我相信维基百科的文章展示了如何用Java做到这一点。
答案 2 :(得分:1)
如果没有某种同步,以这种方式使用共享资源肯定不是一个好主意。我假设没有同步,因为我没有看到任何代码。
鉴于您拥有的代码,while循环永远不会终止,我只能想象缓冲区将在内存不足之前继续增长。
Java为您描述的实现提供了特定的数据结构。您可以考虑查看BlockingQueue
答案 3 :(得分:1)
答案 4 :(得分:1)
首先,看起来你有一个语法错误的拼写错误(反++)。我假设你的意思是(计数++)。
问题的解决方案是Queue而不是列表。特别是,您需要将ConcurrentLinkedQueue用于此应用程序。