【问题标题】:Can you assign unique thread ids and access thread from external program?您可以分配唯一的线程 ID 并从外部程序访问线程吗?
【发布时间】:2011-07-15 17:54:59
【问题描述】:

我目前正在实现一个需要我处理线程和进程的程序。

想法:

  1. 有多个java进程在运行,每个进程可能有多个线程。 当前的 java 实现是这样的,java 中的线程 id 对于特定进程是唯一的,但在进程内不是唯一的。那么有没有办法在多个进程中实现唯一的线程 ID?

  2. 另外,我需要实现一个外部 java 程序来监视这些线程。通过监视我的意思是,根据某些逻辑,我需要通知特定线程(使用唯一线程 id)有关事件。有没有办法可以从外部程序访问线程。如果是怎么办?

  3. 是否有其他解决方案可以实现类似的想法?

提前谢谢你。

【问题讨论】:

  • 我认为您的意思是“在特定流程中是唯一的,但不是不同的流程”。
  • 如果你描述的是你想解决的问题,而不是你的解决方案,你会得到更好的答案。我看不出您曾经向外界公开实际线程的充分理由。相反,我会公开线程将访问的某些内容(例如,包含线程要读取的标志的 JMX bean)。
  • @aasmumnd no...我的意思是我需要在整个应用程序中的所有进程实例中的线程 ID 具有唯一性。 @parsifal 我相信这是我需要的,因为它是更大应用程序的一部分。这是一个大机箱的小模块。
  • @prap19:我提到了您描述 Java 实际功能的那句话(即 跨进程具有唯一的线程 ID) - 我知道您 需要 Java 不提供的东西,即跨进程的唯一线程 ID。 :-)

标签: java multithreading threadpool


【解决方案1】:

您可以使用进程 ID 和线程 ID 的串联来唯一标识一个线程 - 例如,进程 7038 中的线程 23 可以标识为 7038:23。这样做的好处是,给定一个线程标识符,您可以知道该线程属于哪个进程。

我怀疑一个进程是否有可能控制另一个进程的线程。您可能需要使用某种形式的进程间通信,例如RMI、命名管道或 TCP。每个进程可能应该有一个线程来等待传入的消息,对其进行解析,并根据消息的内容通知相应的线程。

一个非常简单的基于 TCP 的解决方案的示例:每个工作进程都有一个线程来监听来自监控进程的 TCP 连接;预计当监控进程连接时,它会写一行包含该工作进程中一个线程的id。工作进程必须保持例如HashMap 将线程 ID 映射到 Thread 对象。

ServerSocket socket = new ServerSocket(6789);
while (true) {
    Socket connectionSocket = welcomeSocket.accept();
    BufferedReader socketReader = new BufferedReader(new InputStreamReader(
                                      connectionSocket.getInputStream()));
    String line = socketReader.readLine();
    int threadId = Integer.parseInt(line);
    // Now, use threadId to locate the appropriate thread 
    // and send a notification to it.
}

可能还应该有一种方法让监控进程向工作进程询问其所有线程 ID。工作进程可以简单地维护一个进程 id 列表(以及每个进程侦听的端口),以及对于每个进程 id,该进程内的线程 id 列表。

顺便说一句,正如@parsifal 所说,了解您实际想要实现的目标会很有趣。

【讨论】:

  • 你能详细说明一下吗?
  • @prap19:是哪一部分? (以及什么样的阐述 - 有没有你不明白的东西,或者你想要代码,......?)
  • 您提到了 RMI、命名管道和 TCP。那么你能解释一下我可以将它与我的问题联系起来的一种方法吗?
  • 谢谢你的解释,这很好理解。但这意味着每个进程将侦听不同的唯一端口,这可能是可伸缩性的问题。如何通过使用 TCP 的类似实现来解决此问题?
  • @prap19:您预计会有多少这样的流程?我会假设现代机器可以毫无问题地处理数千个 TCP 侦听器(不过这是一个猜测;我实际上还没有尝试过)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2015-01-13
相关资源
最近更新 更多