Java 中断UDP套接字接收方法

Java 中断UDP套接字接收方法,java,android,multithreading,udp,Java,Android,Multithreading,Udp,在多线程应用程序中,我有一个线程: datagramSocket.receive(packet); 它等待数据包的执行被receive方法阻止。 同时,其他一些线程想要关闭这个“等待”线程 我怎样才能做到这一点 目前我正在关闭套接字,这将导致抛出SocketException,我认为这不是最好的主意 有什么帮助吗?自己关上插座并不是一个坏主意:我们不能不看上下文,不知道是否有任何设计错误,但我并不讨厌它 另一种方法是将代码放入一个循环中,该循环检查一些volatile标志(很可能已经存在),并

在多线程应用程序中,我有一个线程:

datagramSocket.receive(packet);
它等待数据包的执行被receive方法阻止。 同时,其他一些线程想要关闭这个“等待”线程

我怎样才能做到这一点

目前我正在关闭套接字,这将导致抛出SocketException,我认为这不是最好的主意


有什么帮助吗?

自己关上插座并不是一个坏主意:我们不能不看上下文,不知道是否有任何设计错误,但我并不讨厌它

另一种方法是将代码放入一个循环中,该循环检查一些
volatile
标志(很可能已经存在),并设置超时:

while (on) {
  //...
  datagramSocket.setSoTimeout(5000);
  datagramSocket.receive(packet);
  //...
}

您可以在
DatagramSocket
中设置超时,也可以向
线程发出中断。这不是一个坏主意-这比您将得到的浪费、充满延迟的超时解决方案要好。另一个无浪费、无延迟的解决方案是设置一个“terminate”volatile标志,并向UDP线程发送一个空数据报,从而使receive()调用return,这样它就可以检查标志并终止…甚至可以在您使用的任何消息协议中发送“请关闭”数据报。@MartinJames,除了它是UDP,发送者永远不会知道它的消息是否真实arrived@Raffaele-在本地堆栈上?我怀疑它是否会丢失。代码与您输入的代码几乎相同,不同之处在于SoTimeout设置为0。我希望插座始终打开。在您的情况下,它仅打开5秒钟。问题是,当我甚至将on变量设置为false时,它并没有停止线程,因为它正在等待接收方法。@Pisek要么公开标志并设置超时,要么公开实现(套接字和/或线程)@Pisek套接字在构造时打开,在关闭时关闭。插座在此接收5秒钟。你的反对没有道理。@EJP,我的意思是永远开放和接受