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