DatagramPacket Sender Thread运行速度太快

时间:2011-04-24 11:43:54

标签: java multithreading packet datagram

我编写了一个Java线程(Runnable)来基本存储DatagramPackets列表,如果列表的大小是> 0它将发送列表中的第一个项目。

似乎除非我在run方法中放入大睡眠,否则线程将无响应

public void run()
  {
    while ( true )
    {
      if ( _packetQ.size() > 0)
      {
        try
        {
          _socket.send( _packetQ.remove() );
        }
        catch ( IOException ex )
        {
          System.err.println( "Error sending packet" );
          System.err.println( ex );
        }
      }
    }
  }

_packetQ是数据报包的链接列表。

他们无论如何我可以阻止线程锁定或让它只在packetQ.size()>运行时运行0

谢谢SO

UPDATE :哦,亲爱的,因为代码中的错误,数据包甚至没有被推送到队列,只是浪费了一个小时的调试。感谢您的回复**

4 个答案:

答案 0 :(得分:4)

您可以使用LinkedBlockingQueue替换您的链接列表,它会静默等待,直到新数据到达。

答案 1 :(得分:1)

您可以在第一个while (true)循环中添加类似的内容:

while (_packetQ.size() == 0) {
    Thread.sleep(10);
}

不过更喜欢使用LinkedBlockingQueue,请参阅this answer作为示例。

答案 2 :(得分:1)

我不确定为什么你想要后台发送数据报以及为什么你不只是在调用线程中立即发送数据。您采用的方法对于阻止IO甚至是NIO非常有用,但对UDP来说却没有那么多。 UDP不等待,因此将此工作传递给另一个线程几乎没有价值。

我建议你这样写循环;

  • 你可以通过中断来停止线程。
  • 等待数据准备发送。
  • 打印堆栈跟踪以查找异常。

示例代码

private final BlockingQueue<DatagramPacket> _packetQ = new LinkedBlockingQueue<DatagramPacket>();

public void run() {
    while (!Thread.interrupted()) {
        try {
          _socket.send(_packetQ.take());
        } catch (IOException ex) {
          ex.printStackTrace();
        }
    }
}

答案 3 :(得分:0)

摆脱尺寸测试,让它在remove))方法中阻止。确保您使用具有阻塞行为的队列实现,当然如其他答案中所建议的那样。目前你只是在大小()== 0时无意义地旋转。