当前位置: 首页 > 面试题库 >

中断DatagramSocket.receive中的线程

赵选
2023-03-14
问题内容

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

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

更新:我已经找到问题的分析。它确认行为不一致。


问题答案:

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


 类似资料:
  • 问题内容: 我在主线程中创建一个,然后创建一个内部类线程来侦听端口。当我在主线程中关闭时,它总是遇到错误,因为在内部类线程中我调用了该方法,并且它阻塞了内部类线程。这是内部类的代码: 我想在关闭DatagramSocket之前停止内部类线程,但是不建议使用该方法。我怎样才能做到这一点? 问题答案: 关闭套接字,这将阻止阻止receive()调用。如果您首先设置了一个关闭标志,那么在catch(IO

  • 很多情况下,使用信号来终止一个长时间运行的线程是合理的。这种线程的存在,可能是因为工作线程所在的线程池被销毁,或是用户显式的取消了这个任务,亦或其他各种原因。不管是什么原因,原理都一样:需要使用信号来让未结束线程停止运行。这里需要一种合适的方式让线程主动的停下来,而非让线程戛然而止。 你可能会给每种情况制定一个独立的机制,这样做的意义不大。不仅因为用统一的机制会更容易在之后的场景中实现,而且写出来

  • 问题内容: 有什么方法可以等待线程终止,但仍然拦截信号吗? 考虑以下 C 程序: 一秒钟后结束并打印: 相反,这是我尝试用 Python 编写的尝试: 它打印: 如何使其表现像C版本? 问题答案: Jarret Hardie已经提到过:根据Guido van Rossum的 说法,到目前为止,还没有更好的方法:如文档中所述,块(这意味着没有信号)。另一种选择- 超时(大约)时进行调用并进行检查看起

  • 我正在编写一个有3个线程的程序。一个读取一个文本文件并将单词输入到大小为2的ArraylistBlockingQueue中。下一个获取该列表并反转其中的每个其他单词。最后一个线程获取单词并将它们写入一个新的文本文件。 我所有的东西都在工作,除了我不知道如何中断和停止我的线程。程序写入文本文件,但从未结束。 主要方法 输入 反向类@重写公共void run(){ 输出代码@覆盖公共无效run(){

  • 问题内容: 使用return by时,如何中断它? 问题答案: 为此,您需要将任务分配给,而不是调用。当您执行此操作时,将返回一个可用于操纵计划任务的a。特别是,您可以调用关联程序来中断当前正在执行的任务(或者,如果该任务尚未开始运行,则完全跳过执行)。 顺便说一句,由返回的对象实际上是个。