Java 9 프로세스 API: 주요 개선 사항 및 새로운 기능
Java 9에서 운영체제 프로세스를 제어하고 관리하는 역할을 하는 프로세스 API가 크게 개선되었습니다. ProcessHandle 클래스는 이제 프로세스의 네이티브 프로세스 ID, 시작 시간, 누적 CPU 시간, 인수, 명령, 사용자, 부모 프로세스, 자손 프로세스를 제공합니다. ProcessHandle 클래스는 프로세스 생존 여부 확인과 프로세스 종료 메서드도 제공합니다. onExit 메서드가 있어 CompletableFuture 클래스가 프로세스 종료 시 비동기적으로 액션을 수행할 수 있습니다.
Tester.java
import java.time.ZoneId;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.io.IOException;
public class Tester {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
String np = "Not Present";
Process p = pb.start();
ProcessHandle.Info info = p.info();
System.out.printf("프로세스 ID: %s%n", p.pid());
System.out.printf("명령 이름: %s%n", info.command().orElse(np));
System.out.printf("명령줄: %s%n", info.commandLine().orElse(np));
System.out.printf("시작 시간: %s%n", info.startInstant()
.map(i -> i.atZone(ZoneId.systemDefault()).toLocalDateTime().toString()).orElse(np));
System.out.printf("인수: %s%n", info.arguments().map(a -> Stream.of(a).collect(Collectors.joining(" "))).orElse(np));
System.out.printf("사용자: %s%n", info.user().orElse(np));
}
}
출력
프로세스 ID: 5800
명령 이름: C:\Windows\System32\notepad.exe
명령줄: Not Present
시작 시간: 2017-11-04T21:35:03.626
인수: Not Present
사용자: administrator