如何中断线程等待接收udp数据包?

时间:2016-02-14 04:45:46

标签: java multithreading udp packet

我有以下代码:

    public class ServerConnectionListener implements Runnable {


    DatagramSocket receiveSocket;
    DatagramPacket receivePacket;
    /*
    Some Initilization here in the constructor 
    //
    //
    */


    @Override
    public void run() 
    {
    try {        
         System.out.println("Waiting..."); // so we know we're waiting
         receiveSocket.receive(receivePacket);
      } catch (IOException e) 
         {
         System.out.print("IO Exception: likely:");
         e.printStackTrace();
         System.exit(1);
         }

    //Some more stuff to be done here

    }
 }

我知道receiveSocket.receive()是一个阻塞调用。因此,我想以这样一种方式使用Thread.currentThread()。isInterrupted(),它允许我中断这个线程,而不必等待接收数据包。

1 个答案:

答案 0 :(得分:1)

您无法安全地中断在套接字接收上被阻止的线程。

实现此目的的简单方法是设置合理的超时值(DatagramSocket.setSoTimeout(int milliseconds)),即1秒,并检查每个SocketTimeoutException上的中断标志。

更好但更复杂(从编码的角度来看)解决方案是使用java.nio.channels的设施。