我正在使用本机ProcessBuilder类来创建一个可变大小的进程对象列表。目前,我只需遍历列表,在每个Process实例上调用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();
}
答案 0 :(得分:2)
使用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();
}
}
});
}
}
答案 1 :(得分:1)
您可以使用Blocking Queue(一个可以绑定大小的集合,如果没有空间就会阻止存储)来存储正在运行的进程,在队列不再使用时从队列中删除进程。将等待进程保留在池或队列中,并在空间可用时使用单独的线程将它们注入(运行)队列。
答案 2 :(得分:0)
IIRC在Apache公共区域中有一个可能非常适合的通用池。
答案 3 :(得分:0)
您可以实现同步运行命令的Runnables,然后使用ThreadPoolExecutor来控制线程。