中断DatagramSocket.receive中的一个线程

我正在构建一个侦听TCP和UDP的应用程序,而且我的关机机制遇到了一些问题。 当我在每个侦听线程上调用Thread.interrupt()时,TCP线程会被监听中断,而UDP侦听器则不会。 具体来说,TCP线程使用ServerSocket.accept()ServerSocket.accept()返回(没有实际连接)。 UDP线程使用DatagramSocket.receive() ,但不退出该方法。

这是我的JRE,我的操作系统中的问题,还是应该切换到(Datagram)Socket.close()

更新:我找到了问题的分析 。 它确认行为不一致。

中断网络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(); } } 

据我所知, close()是中断被阻塞的套接字的正确方法。 中断和保持可能已经完成部分读取或写入的操作会使事情变得不必要地复杂化。 只需要处理“成功”或“放弃”结果就更容易了。

DatagramSocket.receive阻塞,直到收到数据报。 您可能需要做的是使用setSoTimeout使其超时。