我目前正在实施一个程序,要求我处理线程和进程。
IDEA:
有多个java进程正在运行,每个进程可能有多个线程。 当前的java实现是这样的,java中的线程ID对于特定进程是唯一的,但不在进程内。那么有没有办法在多个进程中实现独特的线程ID?
另外,我需要实现一个监视这些线程的外部java程序。通过监视我的意思是,根据一些逻辑,我需要通知一个关于事件的特定线程(使用唯一的线程ID)。有没有办法可以从外部程序访问线程。如果是,如何?
是否有其他解决方案可以实现类似的想法?
提前谢谢。
答案 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所说,知道你实际想要实现的目标会很有趣。