English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java에서 9 그전에는 Process API가 로컬 프로세스를 사용하는 기본 지원이 부족했었으며, 예를 들어 프로세스의 PID와 소유자, 프로세스가 시작한 시간, 프로세스가 사용한 CPU 시간, 얼마나 많은 로컬 프로세스가 실행 중인지 등이 그 중에 들어 있습니다.
Java 9 Process API에 ProcessHandle 인터페이스를 추가하여 java.lang.Process 클래스의 기능을 강화했습니다.
ProcessHandle 인터페이스의 예제는 로컬 프로세스를 식별하고 프로세스 상태를 확인하고 관리할 수 있는 로컬 프로세스를 나타냅니다.
ProcessHandle 인터페이스 내부에 Info 내장 인터페이스를 사용하여 개발자가 로컬 프로세스의 PID를 얻기 위해 종종 로컬 코드를 사용해야 하는 어려움을 피할 수 있습니다.
인터페이스에서 메서드 구현을 제공할 수 없습니다. 추상 메서드와 비추상 메서드(메서드와 구현)의 조합을 제공하려면 추상 클래스를 사용해야 합니다。
ProcessHandle 인터페이스에서 선언된 onExit() 메서드는 특정 프로세스가 종료될 때 특정 작업을 트리거할 수 있습니다。
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: %n", p.pid()); System.out.printf("명령 이름: %n", info.command().orElse(np)); System.out.printf("명령 줄: %n", info.commandLine().orElse(np)); System.out.printf("시작 시간: %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 명령 줄: 미존재 시작 시간: 2017-11-04T21:35:03.626 인수: 미존재 사용자: 관리자