我正在为一个研究项目构建一个配对的客户端/服务器应用程序。服务器端应用程序是具有主循环和 ServerSocket 对象的 java 二进制文件。当具有客户端应用程序的用户响起服务器时,我实例化了一个类型为 ClientSession 的新对象,并为它提供将发生通信的套接字。然后我将它作为一个新线程运行,以便服务器应用程序的中心线程可以返回等待调用。
然后,每个 ClientSession 线程都会根据来自客户端程序的请求进行一些处理。它可能接受一个字符串并返回一个小的 SQLite .db 文件作为响应,或者接受一个不同的字符串并返回一个包含文件和文件大小列表的 Java 序列化对象。在所有情况下,ClientSession 线程都是短暂的,并在套接字关闭时关闭。
到目前为止,这一切正常,但今天我面临一个新的挑战,即根据客户的要求运行一个 perl 脚本。该脚本基本上包含了一些对我的问题域有用的低级 Unix OS 函数。如果客户端请求启动此脚本的副本,我不能只在 ClientSession 线程中启动它。perl 脚本需要在调用生命周期后持续存在(可能在带有睡眠计时器的循环中运行数天或数周)。
我想做的是在我的服务器应用程序上设置一个单独的线程并让它包装这个 perl 脚本。
Runtime.getRuntime.exec('perl script.pl');
这将启动它,但现在它会随着 ClientSession 线程而死。
我的想法类似于声明一个 PerlThread 对象,要求它知道谁在请求新线程的用户 ID 作为其构造函数的一部分,让它实现 Runnable 接口,然后只需在新实例上执行 thread.start()它。但在我到达那里之前,我必须在子线程和服务器应用程序的主线程之间进行一些消息传递。所以这个设置让我想到了我的问题:
如何从子线程将消息传递回我的主服务器程序并告诉它客户端请求启动 perl 包装线程?