2012-10-12 2 views
1

Java 프로그램에서 일괄 처리를 실행하기 위해 공통 exe 비동기 방식을 사용하려고합니다. 배치 프로세스.Java common-exe : 일괄 처리를 별도의 스레드에서 실행하여 일괄 출력을 병렬로 읽습니다.

나는이 코드 조각이 비동기

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); 
CommandLine cmdLine = new CommandLine("some batch file"); 
Executor executor = new DefaultExecutor(); 
executor.execute(cmdLine, resultHandler); 

하지만 지금은 내 문제가 병렬로 실행에 배치 파일의 출력 스트림을 읽는 방법 인 프로세스를 실행 것을 배웠습니다. 출력 스트림에서 일부 정보를 처리해야합니다. 여기

내가 노력하고있는 코드의 내 작품이다 .. 나는 .. 내 문제를 해결하는 방법을 알아낼 수 없습니다입니다

String command = "some batch file.bat"; 
PipedOutputStream pipedOutputStream = new PipedOutputStream(); 
PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(pipedOutputStream); 
CommandLine commandLine = null; 

DefaultExecutor defaultExecutor = new DefaultExecutor(); 
DataInputStream dataInputStream = null; 
DefaultExecuteResultHandler executeResultHandler = new DefaultExecuteResultHandler(); 

commandLine.parse(command); 

try { 
    dataInputStream = new DataInputStream(new PipedInputStream(pipedOutputStream)); 
    defaultExecutor.setStreamHandler(pumpStreamHandler); 
    defaultExecutor.execute(commandLine, executeResultHandler); 

    InputStream outCmdStream = null; 
    pumpStreamHandler.setProcessOutputStream(outCmdStream); 
    InputStreamReader outCmdReader = new InputStreamReader(outCmdStream); 
    BufferedReader outCmdBufReader = new BufferedReader(outCmdReader); 
    String procOutputStr; 
    while ((procOutputStr = dataInputStream.readLine()) != null) { 
     System.out.println(procOutputStr); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
    System.out.println("ERROR.RUNNING.CMD"); 
    e.printStackTrace(); 
    System.out.println("ERROR.RUNNING.CMD"); 
} 

답변

0

. 이 추상 클래스는 재정의 할 여러 API를 제공하며,이 API를 사용하여 백그라운드에서 작업을 수행 할 수 있습니다.

다음 예제는 swingworker를 사용하여 백그라운드 스레드를 실행하는 방법을 보여줍니다. 여기

private Document doc; 
... 
SwingWorker<Document, Void> worker = new SwingWorker<Document, Void>() { 
    @Override 
    public Document doInBackground() { 
     // any action you want to perform in backgroud 
     // i.e. in separate thread 
    } 
    @Override 
    public void done() { 
    try { 
     // called after background thread is finished 
    } catch (InterruptedException ex) { 
     ex.printStackTrace(); 
    } catch (ExecutionException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html http://en.wikipedia.org/wiki/SwingWorker

즐기하여 문서화에 대한 링크와 튜토리얼입니다 ...

0

나는 어떤 종류의 위임 패턴 청취자의 (즉, 어떤 종류를 사용합니다 또는 당신이 업무에 등록 할 것이라는 점을 다시 전화하십시오).

당신이 데이터를 읽을 때

, 당신은 ... 합의 된 방법을 통해이 인터페이스를 부를 것이다
while ((procOutputStr = dataInputStream.readLine()) != null) { 
    outputHandler.processOutput(procOutputStr); 
} 

이럴

내가 SwingWorker의 추상 클래스의 도움으로이 기능을 달성 한