Java OS进程队列

Java OS进程队列,java,data-structures,model,Java,Data Structures,Model,我正在使用本机ProcessBuilder类创建大小可变的流程对象列表。目前,我只是在列表中滚动,在每个流程实例上调用start方法。但是,我希望通过将正在运行的进程数量限制为自定义值(例如,处理器数量)来更好地控制应用程序的这一方面。什么数据结构、现有库或模型最适合此任务 Example List<Process> processList = new ArrayList<Process>(); ProcessBuilder pb1 = new ProcessBuild

我正在使用本机ProcessBuilder类创建大小可变的流程对象列表。目前,我只是在列表中滚动,在每个流程实例上调用start方法。但是,我希望通过将正在运行的进程数量限制为自定义值(例如,处理器数量)来更好地控制应用程序的这一方面。什么数据结构、现有库或模型最适合此任务

Example

List<Process> processList = new ArrayList<Process>();
ProcessBuilder pb1 = new ProcessBuilder("myCommand", "myArg1", "myArg2");
ProcessBuilder pb2 = new ProcessBuilder("myCommand", "myArg1", "myArg2");
processList.add(pb1);
processList.add(pb2)

for(Process p : processList)
(
  // more control is needed here
  p.start();
}
示例
List processList=new ArrayList();
ProcessBuilder pb1=新的ProcessBuilder(“myCommand”、“myArg1”、“myArg2”);
ProcessBuilder pb2=新的ProcessBuilder(“myCommand”、“myArg1”、“myArg2”);
processList.add(pb1);
processList.add(pb2)
for(进程p:processList)
(
//这里需要更多的控制
p、 start();
}

IIRC在Apache commons中有一个通用池,可能非常适合。

您可以实现同步运行命令的可运行程序,然后使用来控制线程。

您可以使用(一个集合,其大小可以绑定,如果没有空间,将在存储上阻塞)要存储正在运行的进程,请在不再使用时从队列中删除进程。将等待的进程保留在池或队列中,并在空间可用时使用单独的线程将其注入(正在运行的)队列中。

使用ThreadPoolExecutor。简单示例:

public class PBTest {

static List<Runnable> list = new ArrayList<Runnable>();

public static void main(String args[]) {
    ProcessBuilder pb1 = new ProcessBuilder("foo.exe");
    ProcessBuilder pb2 = new ProcessBuilder("foo.exe");
    ProcessBuilder pb3 = new ProcessBuilder("foo.exe");
    addPB(pb1);
    addPB(pb2);
    addPB(pb3);

    ExecutorService ex = Executors.newFixedThreadPool(1);
    for (Runnable r : list) {
        System.out.println("calling execute");
        ex.execute(r);
    }

    ex.shutdown();
}

static void addPB(final ProcessBuilder pb) {
    list.add(new Runnable() {
        public void run() {
            try {
                pb.start();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    });
}
公共类PBTest{
静态列表=新的ArrayList();
公共静态void main(字符串参数[]){
ProcessBuilder pb1=新的ProcessBuilder(“foo.exe”);
ProcessBuilder pb2=新的ProcessBuilder(“foo.exe”);
ProcessBuilder pb3=新的ProcessBuilder(“foo.exe”);
addPB(pb1);
addPB(pb2);
addPB(pb3);
ExecutorService ex=Executors.newFixedThreadPool(1);
for(可运行的r:list){
System.out.println(“调用执行”);
执行(r);
}
例如关闭();
}
静态无效添加pb(最终ProcessBuilder pb){
添加(新的Runnable(){
公开募捐{
试一试{
pb.start();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
});
}

}

我看到fabstab在我撰写回复时回答了这个问题。