java - Java中如何在线程之间传递进程ID?

标签 java multithreading

我正在为一个研究项目构建一个配对的客户端/服务器应用程序。服务器端应用程序是一个 java 二进制文件,具有主循环和 ServerSocket 对象。当使用客户端应用程序的用户启动服务器时,我实例化一个 ClientSession 类型的新对象,并为其提供将进行通信的套接字。然后我将它作为一个新线程运行,以便服务器应用程序的中央线程可以返回等待调用。

每个 ClientSession 线程然后根据来自客户端程序的请求进行一些处理。它可能接受一个字符串并返回一个小的 SQLite .db 文件作为响应,或者接受一个不同的字符串并返回一个包含文件和文件大小列表的 Java 序列化对象。在所有情况下,ClientSession 线程都是短暂的,并且在套接字关闭时关闭。

到目前为止,一切正常,但今天我面临一个新的挑战,首先是根据客户的请求运行 Perl 脚本。该脚本基本上包含了一些对我的问题域有用的低级 Unix 操作系统函数。如果客户端请求启动此脚本的副本,我不能只在 ClientSession 线程中启动它。 Perl 脚本需要在调用的生命周期结束后持续存在(可能使用 sleep 计时器在循环中运行几天或几周)。

我想做的是在我的服务器应用程序上设置一个单独的线程并让它包装这个 perl 脚本。

    Runtime.getRuntime.exec('perl script.pl'); 

这将启动它,但现在它会随着 ClientSession 线程而终止。

我的想法是声明一个 PerlThread 对象,要求它知道请求新线程的用户 ID 作为其构造函数的一部分,让它实现 Runnable 接口(interface),然后只需在它的新实例。但在到达那里之前,我必须在服务器应用程序的子线程和主线程之间传递一些消息。所以这个设置让我想到了我的问题:

如何从子线程将消息传递回主服务器程序并告诉它客户端请求启动 perl 包装线程?

最佳答案

您应该查看ExecutorService以获得在单独线程上运行作业的更好技术。它比 Thread.start() 或 Runnable.run() 更强大、更方便。

您可以查看Callable构造以查看如何从在其他线程上运行的作业获取结果。

您可以将任务完成时想要从任务中返回的信息传递到域特定可调用的构造函数中,并且当任务完成时,您可以将其取回。

关于java - Java中如何在线程之间传递进程ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19100047/

相关文章:

java - 为什么Android中的java源代码有三个目录/文件夹?

java - DBUnit 中 XML 数据集的路径

java - Aerospike Java 客户端处理多个并发请求

objective-c - 从不同线程访问只读对象的思考

java - spring 数据 mongodb 存储库保存

java - 是否可以将 Hibernate 与 EJB3 一起使用?

java - 使用 jsonschema2pojo 转换可变长度值的枚举

java - 如何让线程等待某个事件的发生

java - 为什么会出现 ArrayIndexOutOfBoundsException?

wpf - WPF:另一个线程拥有的 Storyboard 循环对象