Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีสร้างโปรเซสด้วย ProcessBuilder ใน Java 9

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 ใน Java 9

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);