中断 DatagramSocket.receive 中的线程

2022-09-01 20:42:29

我正在构建一个同时侦听 TCP 和 UDP 的应用程序,并且在关闭机制方面遇到了一些麻烦。当我调用每个侦听线程时,TCP 线程因侦听而中断,而 UDP 侦听器则不中断。具体来说,TCP 线程使用 ,它只是返回(没有实际连接)。而 UDP 线程使用 ,并且不退出该方法。Thread.interrupt()ServerSocket.accept()DatagramSocket.receive()

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

更新:我发现了对问题的分析。它确认行为不一致。


答案 1

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

答案 2

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


推荐