2009-09-29 5 views
1

네이티브 ProcessBuilder 클래스를 사용하여 다양한 크기의 프로세스 개체 목록을 만듭니다. 현재, 각 Process 인스턴스에 대해 start 메소드를 호출하는 목록을 간단히 살펴 보겠습니다. 그러나 실행중인 프로세스의 수를 사용자 지정 값 (예 : 프로세서 수)으로 제한하여 응용 프로그램의 이러한 측면을보다 잘 제어하려고합니다. 이 작업에 가장 적합한 데이터 구조, 기존 라이브러리 또는 모델은 무엇입니까?Java OS Process Queue

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

0

IIRC IIRC에는 Apache 풀의 일반적인 풀이있어 적합 할 수 있습니다.

0

명령을 동 기적으로 실행하는 Runnables를 구현 한 다음 ThreadPoolExecutor을 사용하여 스레드를 제어 할 수 있습니다.

1

실행중인 프로세스를 저장하고 더 이상 사용하지 않을 때 대기열에서 프로세스를 삭제하기 위해 Blocking Queue (공간이 없을 경우 크기를 제한하고 저장소에서 차단할 수있는 모음)을 사용할 수 있습니다. 대기중인 프로세스를 풀 또는 대기열에 유지하고 공간이 사용 가능할 때 별도의 스레드로 실행중인 대기열에 주입하십시오.