【问题标题】:How to interrupt a thread from waiting to receive a udp packet? [duplicate]如何中断线程等待接收 udp 数据包? [复制]
【发布时间】:2016-05-25 03:05:03
【问题描述】:

我有以下代码:

    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(),它允许我中断这个线程,而不必再等待数据包被接收到。

【问题讨论】:

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

标签: java multithreading udp packet


【解决方案1】:

您不能安全地中断在套接字接收上被阻塞的线程。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2015-09-14
    • 2012-11-09
    • 1970-01-01
    • 2010-12-09
    • 2013-03-23
    相关资源
    最近更新 更多