Java库维护进程池

时间:2012-04-24 19:02:54

标签: java multithreading concurrency threadpool executorservice

我正在开发一个需要并发的Java守护程序:一个侦听作业队列的无限循环( redis )和将每个作业分配给一个worker 。工人不一定要返回一个值。

我发现执行者非常有用,我使用ThreadPoolExecutor来维护一些工作线程。

但是,这些工作人员运行的第三方代码需要尽可能以隔离运行,避免共享静态属性。

我的问题:是否有任何Java库/框架提供类似于Executors的功能,例如:

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

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

3 个答案:

答案 0 :(得分:7)

据我所知,你想要以某种方式运行隔离的第三方库 - 例如,他们无法访问静态变量。

我会run your tasks in another ClassLoader。有一些Web框架使用此机制来隔离Web请求。在类加载器之间传递数据有点棘手。我不确定Jetty是怎么做到的。也许使用某种插座?这是一个interesting article about using System.out to share objects。当然是个黑客。


  

我的问题是:是否有任何Java库/框架提供类似于Executors的功能......但是产生进程而不是线程?

现代操作系统将利用现代多处理器架构来充分利用Java线程。在当前进程内部生成另一个线程将在另一个处理器(如果可用)上运行,并且在完全独立的进程中运行该任务将非常高效,尤其是与另一个JVM进程一样繁重的事情。

答案 1 :(得分:2)

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

}

答案 2 :(得分:0)

您是否考虑过使用ProcessBuilder来管理您的孤立流程?

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

我不知道向Executor提交管理子流程的Runnable任务是否是个好主意,但它可能是隔离工作人员的解决方案。