10

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

我发现Executors非常有用,我正在使用ThreadPoolExecutor来维护许多工作线程。

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

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

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

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

4

3 回答 3

8

我知道您有想要以某种方式隔离运行的第 3 方库——例如,它们无权访问静态变量。

我会在另一个运行你的任务ClassLoader。有一些 Web 框架使用这种机制来隔离 Web 请求。在类加载器之间传递数据有点棘手。我不确定 Jetty 是如何做到的。也许使用某种套接字?这是一篇关于使用System.out共享对象的有趣文章。当然是黑客。


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

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

于 2012-04-24T19:05:04.677 回答
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");
    }

}
于 2015-06-12T13:26:28.563 回答
1

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

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

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

于 2012-04-25T07:15:07.493 回答