Java OS进程队列

时间:2009-09-29 14:50:27

标签: java data-structures model

我正在使用本机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();
}

4 个答案:

答案 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来控制线程。