你能从外部程序中分配唯一的线程ID和访问线程吗?

时间:2011-07-15 17:54:59

标签: java multithreading threadpool

我目前正在实施一个程序,要求我处理线程和进程。

IDEA:

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

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

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

  4. 提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用进程ID和线程ID的串联来唯一标识线程 - 例如,进程23中的线程7038可以标识为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所说,知道你实际想要实现的目标会很有趣。