我正在开发一个需要并发的 Java 守护程序:一个无限循环,它侦听作业队列(redis)并将每个作业分配给一个 worker。工人不一定要返回一个值。
我发现Executors非常有用,我正在使用ThreadPoolExecutor来维护许多工作线程。
不过,这些工作人员运行需要尽可能隔离运行的第 3 方代码,避免共享静态属性。
我的问题:是否有任何 Java 库/框架提供类似于 Executors 的功能,例如:
- 工人池
- 自动调整池大小
..但是产生进程而不是线程?
我正在开发一个需要并发的 Java 守护程序:一个无限循环,它侦听作业队列(redis)并将每个作业分配给一个 worker。工人不一定要返回一个值。
我发现Executors非常有用,我正在使用ThreadPoolExecutor来维护许多工作线程。
不过,这些工作人员运行需要尽可能隔离运行的第 3 方代码,避免共享静态属性。
我的问题:是否有任何 Java 库/框架提供类似于 Executors 的功能,例如:
..但是产生进程而不是线程?
我知道您有想要以某种方式隔离运行的第 3 方库——例如,它们无权访问静态变量。
我会在另一个运行你的任务ClassLoader
。有一些 Web 框架使用这种机制来隔离 Web 请求。在类加载器之间传递数据有点棘手。我不确定 Jetty 是如何做到的。也许使用某种套接字?这是一篇关于使用System.out
共享对象的有趣文章。当然是黑客。
我的问题是:是否有任何 Java 库/框架提供类似于 Executors 的功能......但产生进程而不是线程?
现代操作系统将利用现代多处理器架构来充分利用 Java 线程。如果可用,在当前进程中生成另一个线程将在另一个处理器上运行,并且比在完全独立的进程中运行该任务效率更高,尤其是像另一个 JVM 进程一样繁重的进程。
github中有创建进程池的项目。看一看。https://github.com/shri30/ProcessPool
这是一个例子:
示例代码:
public class UsageExample implements JTask{
public static void main(String args[]) throws Exception{
//Create a pool with name : UsageExample-Process and number of processes : 3
ExecutorService pool = ProcessPool.createProcessPool("UsageExample-Process", 3);
ProcessFuture<TaskStatus> pf1 = pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf2 =pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf3 =pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf4 =pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf5 =pool.submit(Task.class, args);
//the get method blocks the call to get the result
TaskStatus ts= pf1.get();
Status status = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
TaskStatus ts2= pf2.get();
Status status2 = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
TaskStatus ts3= pf3.get();
Status status3 = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
TaskStatus ts4= pf4.get();
Status status4 = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
//terminate the pool - pass true for graceful termination, the second parameter is minutes
//wait for task completion
pool.terminate(true, 3000);
}
}
class Task implements JTask{
public static void main(String[] args) {
System.out.println("Executing the sample task");
}
}
您是否考虑过使用 ProcessBuilder 来管理您的隔离流程?
String myJar = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
ProcessBuilder pb = new ProcessBuilder("java", "-classpath", myJar, "package.MainClass");
Process p = pb.start();
我不知道将管理子流程的 Runnable 任务提交给 Executor 是否是个好主意,但这可能是隔离工作人员的解决方案。