2

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

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

但是,当我在线程中尝试以下代码段时

int count = 0;
while(true)
{
    if (buffer.size()>count)
    {
        System.out.println("Processing "+buffer.get(count));
        count++;
    }
}

该线程似乎无法正常工作。

顺便说一句,缓冲区

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

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

有什么建议吗?:-)

4

5 回答 5

3

不,这是队列的经典用途,您可能需要一些BlockingQueue.

于 2013-08-22T17:50:29.927 回答
2

您的线程正在使用忙等待,这就解释了为什么它不能正常工作。当列表为空时,线程会消耗它所能消耗的所有 CPU 资源。你想要相反:只要队列是空的,线程就不应该做任何事情。

有几种设计方法。基本行为被称为生产者-消费者问题。在 Java 中实现它的最简单方法是BlockingQueue使用List. 我相信维基百科的文章展示了如何在 Java 中做到这一点。

于 2013-08-22T17:54:20.923 回答
1

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

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

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

于 2013-08-22T17:53:06.477 回答
1

如果您正在解析字符串协议,请改用队列。

如果您正在解析字节,请考虑使用ByteBuffer,因为它的批量操作对于缓冲来说会更有效。

无论哪种情况,您都可能需要通过同步结构来确保线程安全。

于 2013-08-22T17:53:53.467 回答
1

首先,看起来你有一个语法错误的错字(counter++)。我将假设您的意思是(count++)。

您的问题的解决方案是队列而不是列表。特别是,您将希望为此应用程序使用ConcurrentLinkedQueue 。

于 2013-08-22T17:58:03.440 回答