2012-09-11 2 views
-3

java 명령을 사용하여 배치 파일을 실행하고 데이터베이스에있는 텍스트 파일에서 배치 데이터를 읽는 중입니다. 예를 들어 동일한 배치 파일을 사용하여 15 분 간격으로 430 노드를 실행해야합니다. 그래서 나는 12 개의 스레드에서 430 개의 노드를 나누었습니다. 그래서 각 스레드는 동일한 배치 파일을 가리키는 40 개의 노드를 포함합니다. 그러나 병렬 실행중인 스레드는 배치 파일 명령이 완료 될 때까지 대기 할 수 없습니다. 모든 작업이 15 분 이내에 완료되어야하기 때문에 각 스레드를 기다릴 수 없습니다. 어떤 제안?java 멀티 스레딩

다음은 멀티 스레딩을 실행하는 코드입니다.

for (int i = 0; i < noOfMainThreads; i++) { 
     // running 12 thread for 40 node 
     threadArr[i] = new Thread(runnableArr[i]); 
     runnableArr[i] = new CodeBatchfile(nodeArr,nodeidArr); 
    } 

    for (int i = 0; i < noOfMainThreads; i++) { 
     threadArr[i].start; 
    } 


class CodeBatchfile{ 


    void run(){ 
     for (int i=1;i<nodename.length;i++) { 
      // exciting batch file using 12 threads. 
      cmd = filepath + " " + nodenamelocal; 
      try { 
       process = Runtime.getRuntime().exec(cmd, null, bdir); 
       process.waitFor(); 
      } 
      catch(Exception ex) { 
       System.out.println("Exception Running batch file" + ex.getLocalizedMessage()); 
      } 
     } 
    } 
+0

"스레드는 배치 파일 명령이 완료 될 때까지 기다릴 수 없습니다. 왜 안 되니? –

+2

코드를 제대로 들여 씁니다. 이것은 혼란스럽고 심지어 중괄호가 빠지지 않습니다. – Keppil

+0

이것은 파싱 할 수 없습니다 ... –

답변

1

ExecutorService을 대신 사용하십시오. 각 단계가 다음과 같이 작동하는 파이프 라인을 만듭니다.

작업을 수행하는 데 필요한 모든 정보와 결과 필드가 포함 된 작업 개체를 만듭니다. 모든 작업 개체를 만들고이를 실행하기 위해 대기열에 넣으십시오.

따라서 첫 번째 단계는 일괄 프로그램을 실행하기 위해 430 개의 작업을 만드는 것입니다. 각 작업은 배치 프로그램을 시작하고 종료 할 때까지 기다립니다. 일} 처리가 종료되면, 출력을 읽고이를 작업 인스턴스에 넣습니다.

N 개의 작업을 병렬로 실행하는 실행 프로그램을 작성하십시오. N을 조정해야합니다. CPU 집약적 인 작업 인 경우 N = 코어 수입니다. IO 집중적 인 작업 인 경우 더 높은 값 (CPU 코어가 일반적으로 잘 작동하는 2-4 배)을 시도하십시오.

모든 작업을 실행 프로그램의 대기열에 넣으십시오. 작업이 완료 될 때까지 기다린 후 새 작업을 작성하여 실행 프로그램의 입력 대기열에 넣으십시오.

작업 카운터 (시작, 완료)를 보관하여 언제 중지해야하는지 알 수 있도록하십시오.

Tutorial.

+0

대단히 감사합니다. – vinay

0

CyclicBarrier를 사용해야한다고 생각합니다. barrier는 모든 스레드가 장벽에 도달 할 때까지 특정 지점에서 기다릴 수있게 해주므로 일괄 처리를 실행 한 후에 cyclicBarrier의 대기를 호출해야합니다. 좋은 코드 예제는 여기에서 찾을 수 있습니다 : enter link description here