2009-09-29 31 views
1

我正在使用本机ProcessBuilder类来创建一个可变大小的进程对象列表。目前,我简单地浏览了每个Process实例上调用start方法的列表。然而,我想通过将我的运行进程的数量限制为自定义值(例如处理器的数量)来更好地控制应用程序的这个方面。哪些数据结构,现有库或模型最适合此任务?Java OS进程队列

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(); 
} 

回答

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(); 
      } 
     } 
    }); 
} 

}

+0

我看到fabstab回答了这个问题,而我在创作我的答复。 – JZeeb 2009-09-29 16:00:42

0

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

1

您可以使用Blocking Queue(如果没有空间,您可以绑定并阻止存储的集合)存储正在运行的进程,并在队列不再使用时从队列中删除进程。将等待进程保留在池或队列中,并在空间变得可用时使用单独的线程将它们注入(运行)队列。