Java DatagramPacket发送器线程运行过快
我已经编写了一个Java线程(Runnable)来基本上存储一个Datagrampackes列表,如果列表的大小大于0,它将发送列表上的第一项 看起来,除非我在run方法中放入大量睡眠,否则线程将变得无响应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
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();
}
}
}