검색결과 리스트
글
Runtime.getRuntime().exec() 호출시 종료되지 않는 문제
아시다시피 위 함수는 process 를 실행시키기 위한 것입니다.
그런데 만약 프로세스의 수행이 끝이 날때까지 기다려야 한다면 어떻게 할까요?
일반적으로 아래와 같이 waitFor() 를 호출해 줍니다.
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor();
문제는 waitFor() 가 영원히 끝나지 않는 경우가 발생한다는 것입니다.
분명히 cmd 에 해당하는 프로세스가 종료되어야 하는데, 이상하게도 끝나지 않는다는 이야깁니다.
원인은 stream 의 버퍼가 비워지지 않았기 때문입니다.
이를 비워줌으로써 문제를 해결할 수 있습니다.
그럼 어떻게 비워주면 될까요?
waitFor() 함수를 호출하는 순간, Thread 는 process 가 종료될때까지 block 이 됩니다.
다시 말해서 해당 stream 을 비워주는 작업을 별도의 thread 에서 수행해야 한다는 이야기죠.
별도 Thread 를 만들고, 이 Thread 에서 process.getErrorStream(); process.getInputStream(); 를 통해 Stream 을 얻어온 뒤, 계속해서 read 해 줌으로써 스트림을 비워야 한다는 것입니다.
만약, process 수행결과 얻어지는 출력을 필요로 하지 않는다면 코드는 훨씬 간단해 집니다.
아래처럼 애초에 stream 을 close 해 버리면 되거든요. :)
Process process = Runtime.getRuntime().exec(cmd);
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
process.waitFor();
문제없이 process 가 실행 후, waitFor() 에서 빠져가나는 것을 확인하실 수 있습니다.
'Java' 카테고리의 다른 글
FolderMonitoring - 파일 변경 감지하는 방법 (0) | 2011.09.30 |
---|---|
Java로 나만의 프로토콜 만들기 (1) | 2011.06.16 |
[팁] JNI 의 jstring 을 LPCWSTR(wchar_t)로 변환하기 (0) | 2011.05.25 |
JNI 를 사용한 Folder Monitoring (1) | 2011.05.24 |
RECENT COMMENT