Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何中断线程等待接收udp数据包?_Java_Multithreading_Udp_Packet - Fatal编程技术网

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

Java 如何中断线程等待接收udp数据包?,java,multithreading,udp,packet,Java,Multithreading,Udp,Packet,我有以下代码: public class ServerConnectionListener implements Runnable { DatagramSocket receiveSocket; DatagramPacket receivePacket; /* Some Initilization here in the constructor // // */ @Override public void

我有以下代码:

    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()的方式,使我可以中断此线程,而无需再等待数据包被接收。

您无法安全地中断套接字接收上阻塞的线程

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


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

的功能,您可以从另一个线程关闭套接字。这将导致
receive
引发异常。是的,这肯定会起作用:)。但是假设另一个线程没有socket的引用。在这种情况下,我能做些什么吗?将
close
方法放入
ServerConnectionListener