【问题标题】:DatagramPacket Sender Thread running too fastDatagramPacket Sender 线程运行太快
【发布时间】:2011-08-11 20:02:18
【问题描述】:

我编写了一个 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 时运行

非常感谢

更新:天哪,由于代码错误,数据包甚至没有被推送到队列中,只是浪费了一个小时的调试时间。感谢您的回复**

【问题讨论】:

    标签: java multithreading packet datagram


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      虽然更喜欢使用LinkedBlockingQueue,但请参阅this answer 作为示例。

      【讨论】:

        【解决方案3】:

        我不确定您为什么要在后台发送数据报,以及为什么不立即在调用线程中发送数据。您采用的方法对于阻止 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();
                }
            }
        }
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-16
            • 2020-10-27
            • 1970-01-01
            相关资源
            最近更新 更多