java - 如何在 Java 中向 hibernate 线程发出信号?

标签 java multithreading blocking

我正在为网络类编写 UDP 客户端-服务器对,但我遇到了一个问题。这是一个相当不正统的网络作业,所以先了解一下背景:

目标是创建一个服务器来实现基于推送的通知。这里的关键点是服务器 必须通过它最后看到的任何地址联系客户端,并监听客户端的控制数据包。因此,我有一个在客户端上运行的线程,它定期向服务器发送 UDP 数据包,当它需要发送响应时记录它们的来源。当发送刷新地址转换时,这种技术也可以通过 NAT。

那么,这就是我的困境:除非我弄错了,否则 NAT 会将自己的地址和生成的端口号映射到它的客户端地址 端口 组合上。因此,为了成功穿越 NAT,我需要通过客户机上的一个端口移动所有数据包。更新线程只需监听一段时间,推出一个更新数据包,然后返回监听。

这就是它变得毛茸茸的地方。如果想要执行某些操作的原始线程想要端口,它必须唤醒在等待响应时阻塞的播音员。

我怎样才能在 Java 中做到这一点?

P.S.:如果事实证明 NAT 允许不同端口上的通信通过,那么事情就很棒了。

最佳答案

注意:我不一定要告诉您这是解决更大问题的正确方法。

但您的首要问题“我如何在 Java 中向 hibernate 线程发出信号”的答案是:调用 interrupt()在线程上。您需要一个更精细的机制来传达为什么它被打断,但这只是一个开始。 interrupt() 将唤醒 sleep()荷兰国际集团或wait()带有 InterruptedException 的线程,但我认为这不是您真正要问的。

这将不会唤醒阻塞在 read() 调用上的线程,比如套接字。听起来您正在使用 DatagramSocket,在这种情况下您有两种选择:

  • 使用非阻塞实现。 (又名“基于选择器”,或 Java 术语中的新 I/O (nio))参见例如DatagramChannel ;也可能this SO question和/或 this one
  • 使用普通的 Java I/O,set a socket timeout适当的长度,并将对 read() 的调用包装在一个循环中,检查适当的条件。

关于java - 如何在 Java 中向 hibernate 线程发出信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5131330/

相关文章:

java - 在 JFrame 和 Windows 任务栏中使用不同的图标

java - Wordpress API - 如何在 Android/Java 中循环对象的 JSON 数组

java - 通过 Java 线程或 NDK pthread 加载 JNI 库?

独立 JAVA 应用程序中的 MySql 池数据源(无 J2EE 容器、无 JNDI、无 TOMCAT 等)

java - 在android中安排mediaplayer的执行

带锁的 Java 条件

c# - 为什么后台线程中的图形操作会阻塞主 UI 线程中的图形操作?

java - 转换 CharSequence[] 和 CharSequence[]

java - PriorityBlockingQueue 阻塞时间过长

c - 线程中的 OpenMP 阻塞调用