我正在开发一个需要并发的Java守护程序:一个侦听作业队列的无限循环( redis )和将每个作业分配给一个worker 。工人不一定要返回一个值。
我发现执行者非常有用,我使用ThreadPoolExecutor来维护一些工作线程。
但是,这些工作人员运行的第三方代码需要尽可能以隔离运行,避免共享静态属性。
我的问题:是否有任何Java库/框架提供类似于Executors的功能,例如:
..但是产生进程而不是线程?
答案 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任务是否是个好主意,但它可能是隔离工作人员的解决方案。