【问题标题】:Breaking out of UDP socket receive method突破UDP套接字接收方法
【发布时间】:2014-01-08 04:58:02
【问题描述】:

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

datagramSocket.receive(packet);

等待数据包 - 使用 receive 方法阻止执行。 与此同时,其他一些线程想要关闭这个“等待”的线程。

我怎样才能做到这一点?

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

有什么帮助吗?

【问题讨论】:

  • 您可以在DatagramSocket 中设置超时,也可以向Thread 发出中断。
  • 这不是一个坏主意 - 它比您将获得的浪费、延迟缠身的超时解决方案要好。另一个无浪费、无延迟的解决方案是设置一个“终止”易失性标志并向 UDP 线程发送一个空数据报,因此让 receive() 调用返回,以便它可以检查标志并终止。
  • ..或者甚至在您使用的任何消息协议中发送“请关闭”数据报。
  • @MartinJames 除了它是 UDP 并且发件人永远不会知道它的消息是否真的到达
  • @Raffaele - 在本地堆栈上?我怀疑它会丢失。

标签: java android multithreading udp


【解决方案1】:

自己关闭套接字并不是一个坏主意:我们不能说没有看到上下文并告诉我们是否犯了任何设计错误,但我并不讨厌它。

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

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

【讨论】:

  • 代码与您输入的几乎相同,不同之处在于 SoTimeout 设置为 0。我希望套接字始终打开。在您的情况下,它仅打开 5 秒钟。他的问题是,当我什至将 on 变量设置为 false 时,它​​不会停止线程,因为它正在等待 receive 方法。
  • @Pisek 要么公开标志并设置超时,要么公开实现(套接字和/或线程)
  • @Pisek 套接字在您构建时打开,在您关闭时关闭。套接字在此处接收 5 秒钟。你的反对没有道理。
  • @EJP,我的意思是始终开放和接收
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2015-11-26
  • 2012-07-17
  • 2013-03-18
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多