我正在构建一个侦听TCP和UDP的应用程序,而且我的关机机制遇到了一些问题。当我在每个侦听线程上调用Thread.interrupt()
时,TCP线程会因监听而中断,而UDP侦听器则不会。具体来说,TCP线程使用ServerSocket.accept()
,它只返回(没有实际连接)。 UDP线程使用DatagramSocket.receive()
,但不退出该方法。
这是我的JRE,操作系统中的问题,还是我应该切换到(Datagram)Socket.close()
?
更新:我发现了analysis问题。它证实了行为不一致。
答案 0 :(得分:29)
中断网络IO的常用习惯是关闭通道。如果你需要在等待发送或接收时有效地中断它,那将是一个不错的选择。
public class InterruptableUDPThread extends Thread{
private final DatagramSocket socket;
public InterruptableUDPThread(DatagramSocket socket){
this.socket = socket;
}
@Override
public void interrupt(){
super.interrupt();
this.socket.close();
}
}
答案 1 :(得分:2)
据我所知,close()
是中断被阻塞的套接字的正确方法。中断和保持可能已经完成部分读取或写入的操作会使事情变得不必要地复杂化。只需要处理“成功”或“放弃”结果就更容易了。
答案 2 :(得分:0)
DatagramSocket.receive
阻塞,直到收到数据报。您可能需要做的是使用setSoTimeout
使其超时。