用于维护进程池的Java库

用于维护进程池的Java库,java,multithreading,concurrency,threadpool,executorservice,Java,Multithreading,Concurrency,Threadpool,Executorservice,我正在处理一个需要并发性的Java守护进程:一个无限循环,它侦听作业队列(redis)并将每个作业分发给一个工作者。工作者不必返回值 我发现执行器非常有用,我正在使用维护大量工作线程 不过,这些工作人员运行的第三方代码需要尽可能独立运行,避免共享静态属性 我的问题:是否有Java库/框架提供类似于执行器的功能,如: 工作人员池 自动调整池大小 …但是产生进程而不是线程?我知道您有第三方库,您希望以某种方式隔离运行,因此它们无法访问静态变量 我会的。有些web框架使用这种机制来隔离web请求。

我正在处理一个需要并发性的Java守护进程:一个无限循环,它侦听作业队列(redis)并将每个作业分发给一个工作者。工作者不必返回值

我发现执行器非常有用,我正在使用维护大量工作线程

不过,这些工作人员运行的第三方代码需要尽可能独立运行,避免共享静态属性

我的问题:是否有Java库/框架提供类似于执行器的功能,如:

  • 工作人员池
  • 自动调整池大小

…但是产生进程而不是线程?

我知道您有第三方库,您希望以某种方式隔离运行,因此它们无法访问静态变量

我会的。有些web框架使用这种机制来隔离web请求。在类加载器之间传递数据有点棘手。我不知道Jetty是怎么做到的。也许使用某种插座?这是一个例子。当然是黑客


我的问题是:是否有任何Java库/框架提供类似于执行器的特性。。。但是产生进程而不是线程


现代操作系统将利用现代多处理器体系结构来充分利用Java线程。在当前进程中生成另一个线程将在另一个处理器上运行(如果可用),这将比在完全独立的进程中运行该任务效率更高,特别是像另一个JVM进程那样繁重的任务。

您是否考虑过使用ProcessBuilder来管理隔离的进程

String myJar = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
ProcessBuilder pb = new ProcessBuilder("java", "-classpath", myJar, "package.MainClass");
Process p = pb.start();

我不知道将管理子流程的可运行任务提交给执行者是否是一个好主意,但它可能是隔离工作人员的解决方案。

github中有一个创建流程池的项目。看一看

以下是一个例子:

示例代码:

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");
    }

}
public类UsageExample实现JTask{
公共静态void main(字符串args[])引发异常{
//创建一个名为UsageExample Process、进程数为3的池
ExecutorService pool=ProcessPool.createProcessPool(“UsageExample Process”,3);
ProcessFuture pf1=pool.submit(Task.class,args);
ProcessFuture pf2=pool.submit(Task.class,args);
ProcessFuture pf3=pool.submit(Task.class,args);
ProcessFuture pf4=pool.submit(Task.class,args);
ProcessFuture pf5=pool.submit(Task.class,args);
//get方法阻止调用以获取结果
TaskStatus ts=pf1.get();
Status Status=ts.getStatus();
if(status==status.suces){
//代码在这里
}
TaskStatus ts2=pf2.get();
Status status2=ts.getStatus();
if(status==status.suces){
//代码在这里
}
TaskStatus ts3=pf3.get();
Status status3=ts.getStatus();
if(status==status.suces){
//代码在这里
}
TaskStatus ts4=pf4.get();
Status status4=ts.getStatus();
if(status==status.suces){
//代码在这里
}
//终止池-传递为true对于优雅终止,第二个参数是分钟
//等待任务完成
pool.terminate(true,3000);
}
}
类任务实现JTask{
公共静态void main(字符串[]args){
System.out.println(“执行示例任务”);
}
}

谢谢你的回答@Gray,我明白你的意思。在这种情况下,我需要隔离这些工作人员(例如,防止共享静态变量等),并可能在具有不同系统属性的JVM中运行它们。所以我的问题仍然是,如果我需要运行多个进程(而不是线程),是否有一个框架可以提供帮助?另外,请再次回顾这个Q的标题,因为我真正想问的是这样一个框架是否存在,而不是使用它是否明智。你可以在另一个类加载器中运行它们。这就是web服务器隔离类所做的。我不确定如何在两个类加载器之间传递数据。也许使用某种插座:谢谢@Gray;看来我得做些功课,看看这是否有帮助,然后再联系你。嗯,避免使用静态变量要比尝试让进程间通信以任何高性能正常工作容易得多。我听@Martin说,他在使用第三方代码之类的东西。嗯……刚刚看到了这个……有趣的想法。我需要检查它是否有效,以及您提到的执行人是否有任何影响。谢谢请详细说明一个实际的答案,不要只是张贴外部链接。我继续为你详细说明