我怎样才能阻止线程中的块方法DatagramSocket.receive()
问题描述:
我在主线程中创建一个DatagramSocket
,然后创建一个内部类线程来侦听端口。当我在主线程中关闭DatagramSocket
时,它总是遇到错误socket closed
,因为在内部类线程中,我调用方法,并且它阻塞了内部类线程。这里是内部类的代码:我怎样才能阻止线程中的块方法DatagramSocket.receive()
class ReceiveText extends Thread
{
@Override
public void run()
{
while(true)
{
byte[] buffer = new byte[1024];
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
try {
udpSocket.receive(dp);//blocked here
byte[] data = dp.getData();
String message = new String(data, 0 , dp.getLength());
setTxtAreaShowMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我想阻止关闭DatagramSocket的前内部类的线程,但不建议stop()
方法。我怎样才能做到这一点?
答
关闭套接字,它将阻止receive()调用阻塞。如果您首先设置了一个闭合标志,那么在catch(IOException)块中,如果设置了该标志,则可以安全地忽略该异常。 (您可能也可以在DatagramSocket上使用isClosed()方法而不是标记)
答
使用UDP,您可以从另一个线程向套接字发送一个数据报,以解除对read()的阻止。 datagran可以(取决于你的协议)包含'suicide'命令,或者你可以使用线程在read()返回后读取的额外的'shutdown'布尔值。
答
Socket.close()可以做到这一点。或者你可以使用socket.setSoTimeout(1000); setSoTimeout()方法允许您定义以毫秒为单位的超时期限。例如:
//if the socket does not receive anything in 1 second,
//it will timeout and throw a SocketTimeoutException
//you can catch the exception if you need to log, or you can ignore it
socket.setSoTimeout(1000);
socket.receive();
这里是javadoc for setSoTimeout();
默认情况下,超时是0,它是不确定的,通过将其更改为正数,它将仅阻塞您指定的数量。 (请确保您调用socket.receive之前设置())
这里是回答在这个网站的例子: set timeout for socket receive
这是一个解决方案,谢谢 – cloud
我也可以证实这一点的工作!很好的方式来打破在数据报套接字的接收循环中的工作线程。 – Nerdtron