2009-09-29 57 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(如果沒有空間,您可以綁定並阻止存儲的集合)存儲正在運行的進程,並在隊列不再使用時從隊列中刪除進程。將等待進程保留在池或隊列中,並在空間變得可用時使用單獨的線程將它們注入(運行)隊列。