【问题标题】:java multiple threads taking turnjava多线程轮流
【发布时间】:2013-12-14 23:59:16
【问题描述】:

我有 2 个 java 线程接收 UDP 多播。

每个线程将接收来自不同多播流的 UDP 数据包,例如大约 60 Mbps,然后处理共享 BlockingQueue 中的 UDP 数据包和队列。 UDP 数据包大约 1300 字节。

我想要队列中处理的 UDP 数据包的顺序,这与数据包到达机器 NIC 的方式相同,即使从不同线程(不同的多播流)接收数据包也是如此。

我无法在这些线程中实现这一点,这是我的问题。

是否可以使用 java,或者我应该使用 C 之类的其他语言?

编辑

基本上,线程将从不同的多播流接收多播,队列中的数据包顺序将取决于接收线程如何执行以从 NIC 获取数据包的顺序,但我希望顺序与数据包到达 NIC 的方式相同。

我尝试降低每个流的 UDP 接收缓冲区,数据包几乎按顺序进入队列,但数据包开始丢失。如果我增加接收缓冲区,队列中的顺序完全取决于接收线程的执行方式。

请帮助我。有可能吗?

【问题讨论】:

  • 几乎可以肯定。你试过什么?您的解决方案在哪里失败?
  • 我试过做 Thread.yield() 和 Thread.sleep(0),让每个 RX 线程轮流,但我没有得到正确的结果
  • 基本上,线程将从不同的多播流接收多播,队列中的数据包顺序将取决于接收线程执行从网卡获取数据包的顺序,但我希望顺序与数据包到达的方式相同网卡。
  • @Keppil 你能指导我吗?
  • 很抱歉,这仍然太模糊,我无法为您提供帮助。

标签: java multithreading sockets udp multicast


【解决方案1】:

序列号?定义一个流控制类,该类包含一个序列号,该序列号递增并加载到从该流接收的每个缓冲区对象中,池线程可以检查的“最后处理”号以及每个乱序缓冲区的列表已被您的池出列。

池线程检查它们出列的缓冲区是否具有正确的序列号(last-processed+1)。如果是这样,它们会处理该缓冲区以及列出的缓冲区中的任何后续数字。如果没有,他们将该缓冲区添加到列表中以供以后处理。

PS:流控制类方法肯定需要锁定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2012-02-27
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多