Java 9 เพิ่ม interface ProcessHandle ให้ Process API เพื่อเสริมศักยภาพ Process class Instance ของ ProcessHandle interface ระบุ local process ช่วย query process status และจัดการ processes ProcessHandle.Info ช่วยใช้ local code เพราะต้องการได้ PID ของ local process
ProcessBuilder class ใช้สร้าง separate OS processes ตัวอย่างสร้าง process ของ notepad application ด้วย ProcessBuilder class
ตัวอย่างโค้ด
import java.time.ZoneId;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.io.IOException;
public class ProcessBuilderTest {
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("Process ID : %s%n", p.pid());
System.out.printf("Command name : %s%n", info.command().orElse(np));
System.out.printf("Command line : %s%n", info.commandLine().orElse(np));
System.out.printf("Start time: %s%n",
info.startInstant().map(i -> i.atZone(ZoneId.systemDefault()).toLocalDateTime().toString()).orElse(np));
System.out.printf("Arguments : %s%n",
info.arguments().map(a -> Stream.of(a).collect(Collectors.joining(" "))).orElse(np));
System.out.printf("User : %s%n", info.user().orElse(np));
}
}
ผลลัพธ์
Process ID : 3728
Command name : C:\WINDOWS\System32\notepad.exe
Command line : Not Present
Start time: 2020-04-20T18:06:30.378
Arguments : Not Present
User : Tutorialspoint\User

ProcessBuilder Methods สำคัญ
| Method | คำอธิบาย |
|---|---|
| command(List<String>) | ตั้งค่าคำสั่งและ arguments |
| command(String...) | ตั้งค่าคำสั่งแบบ varargs |
| directory(File) | ตั้งค่า working directory |
| environment() | ได้ environment variables map |
| redirectInput/Output/Error | ตั้งค่า I/O redirection |
| start() | เริ่ม process คืน Process object |
| inheritIO() | สืบทอด I/O จาก parent process |
ProcessHandle.Info Methods
| Method | Return Type | คำอธิบาย |
|---|---|---|
| command() | Optional<String> | Executable path |
| commandLine() | Optional<String> | Full command line |
| arguments() | Optional<String[]> | Arguments array |
| startInstant() | Optional<Instant> | Start time |
| totalCpuDuration() | Optional<Duration> | Total CPU time |
| user() | Optional<String> | User running process |
Process Methods ใหม่ใน Java 9
Process p = pb.start();
// New in Java 9
long pid = p.pid(); // Get PID directly
ProcessHandle ph = p.toHandle(); // Convert to ProcessHandle
CompletableFuture<Process> cf = p.onExit(); // Async completion
boolean supportsNormalTermination = p.supportsNormalTermination();
Complete Example with I/O
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir");
pb.directory(new File("C:\\"));
pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
pb.redirectError(ProcessBuilder.Redirect.PIPE);
Process p = pb.start();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
int exitCode = p.waitFor();
System.out.println("Exit code: " + exitCode);