Java DatagramPacket发送器线程运行过快

Java DatagramPacket发送器线程运行过快,java,multithreading,packet,datagram,Java,Multithreading,Packet,Datagram,我已经编写了一个Java线程(Runnable)来基本上存储一个Datagrampackes列表,如果列表的大小大于0,它将发送列表上的第一项 看起来,除非我在run方法中放入大量睡眠,否则线程将变得无响应 public void run() { while ( true ) { if ( _packetQ.size() > 0) { try { _socket.send( _packetQ.r

我已经编写了一个Java线程(Runnable)来基本上存储一个Datagrampackes列表,如果列表的大小大于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时让它运行

谢谢


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

您可以在第一个
while(true)
循环中添加如下内容:

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

但是,您更愿意使用
LinkedBlockingQueue
,请参见作为示例。

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

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

但是,您更愿意使用
LinkedBlockingQueue
,请参见作为示例。

您可以将链表替换为静默等待新数据到达的。

您可以将链表替换为静默等待新数据到达的。

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

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

我不确定您为什么要在后台发送数据报,以及为什么不在调用线程中立即发送数据。您所采取的方法对于阻塞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();
        }
    }
}
private final BlockingQueue_packetQ=new LinkedBlockingQueue();
公开募捐{
而(!Thread.interrupted()){
试一试{
_socket.send(_packetQ.take());
}捕获(IOEX异常){
例如printStackTrace();
}
}
}

我不确定您为什么希望后台发送数据报,以及为什么不在调用线程中立即发送数据。您所采取的方法对于阻塞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();
        }
    }
}
private final BlockingQueue_packetQ=new LinkedBlockingQueue();
公开募捐{
而(!Thread.interrupted()){
试一试{
_socket.send(_packetQ.take());
}捕获(IOEX异常){
例如printStackTrace();
}
}
}