Interrupt a thread in DatagramSocket.receive

前端 未结 3 1267
孤城傲影
孤城傲影 2020-12-17 09:03

I\'m building an application that listens on both TCP and UDP, and I\'ve run into some trouble with my shutdown mechanism. When I call Thread.interrupt() on eac

相关标签:
3条回答
  • 2020-12-17 09:46

    DatagramSocket.receive blocks until it receives a datagram. Probably what you need to do is use setSoTimeout to make it timeout.

    0 讨论(0)
  • 2020-12-17 09:52

    A common idiom for interrupting network IO is to close the channel. That would be a good bet if you need to effectively interrupt it while its waiting on sending or receiving.

    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();
       }
    }
    
    0 讨论(0)
  • 2020-12-17 10:02

    As far as I know, close() is the proper way to interrupt a blocked socket. Interrupting and keeping open something that may have already done a partial read or write makes things unnecessarily complex. It's easier to only have to deal with a "success" or "give up" result.

    0 讨论(0)
提交回复
热议问题