我的情况:
我有两个线程同时运行,一个线程想要等待,直到另一个线程使用某个端口,该线程在到达使用该端口的点之前将运行一定数量的步骤。
我必须遵守的另一个限制是,在打开端口之前执行这些步骤的线程与其他线程之间没有轻松的通信,因为它是使用 API 的 JNI native C 代码(希望不适用于问题,它通过一个大方法运行)
问题:
有没有办法让java能够等到端口被使用?我查看了 stackoverflow 的解决方案,但它们有一些问题:
- 创建新套接字将导致端口被使用,我的其他线程将无法访问此套接字。
- 使用 netstat 解析器会降低项目的可移植性。
如果我忽略了 stackoverflow 的答案,请责骂我无法搜索或其他什么,任何事情都会有帮助。
最佳答案
Is there a way for java to be able to wait until the port is in use?
不在纯 Java 中。
但是假设两个线程运行在同一个JVM中,它们可以通过其他方式进行通信。因此,您可以使用共享标志(例如, volatile boolean 变量或 AtomicBoolean
)或 CountDownLatch
或 Semaphore
。您可以使用其中任何一个来实现一个简单的操作,其中一个线程(实际上)告诉另一个线程它正在使用该端口。
(事实上,如果您希望一个线程等待另一个线程,闩锁是最佳选择。)
<小时/>这不是那种在 JNI 中容易做到的事情。 AFAIK,netstat
程序不使用普通的系统调用来执行此操作。我认为它使用“/proc”树或(在旧的实现中)直接访问内核内存来获取它需要的信息。您可以在 native 库中复制此操作,但我怀疑您是否会找到现有的库来执行此操作。当然,Windows 实现会完全不同......
关于Java - 检查端口是否正在使用而不连接到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284008/