如何在 Java 9 中使用 Process API 終止/銷燬程序?
在 Java 9 中,程序 API 支援一種簡便的方法來獲取有關程序的大量資訊。ProcessHandle 介面可以識別並提供對本地程序的控制以及檢查程序的活動狀態和銷燬程序的方法,而 ProcessHandle.Info 介面可以提供程序的資訊快照。我們需要使用 ProcessHandle 介面的 destroy() 方法來銷燬程序。
在下面的示例中,我們需要使用 ProcessHandle 介面來終止程序。
示例
import java.io.File;
import java.io.IOException;
import java.util.Objects;
public class DestroyProcessTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("---------------------------");
System.out.println("Destroy Process:");
final String javaCmd = getJavaCmdFromParent();
final String classpath = getClassPathFromParent();
try {
final Process process = new ProcessBuilder(javaCmd, "-cp", classpath, DestroyProcessTest.class.getName()).start();
ProcessHandle processHandle = process.toHandle();
printInfo(processHandle);
destroyProcess(processHandle);
Thread.sleep(1000);
System.out.println("---------------------------");
System.out.println("After destroying the process:");
printInfo(processHandle);
} catch(IOException e) {
e.printStackTrace();
}
}
private static String getClassPathFromParent() {
return System.getProperty("java.class.path", "./*");
}
private static String getJavaCmdFromParent() {
return Objects.isNull(System.getProperty("java.home")) ? "java"
: String.format("%s%sbin%sjava", System.getProperty("java.home"), File.separator, File.separator);
}
private static void destroyProcess(ProcessHandle processHandle) throws IllegalStateException {
System.out.println("Ready to destroy Process with id: " + processHandle.pid());
processHandle.destroy();
}
private static void printInfo(ProcessHandle processHandle) {
System.out.println("---------");
System.out.println("Id: " + processHandle.pid());
System.out.println("isAlive(): " + processHandle.isAlive());
System.out.println("isSupportsNormalTermination(): " + processHandle.supportsNormalTermination());
ProcessHandle.Info processInfo = processHandle.info();
System.out.println("Info: " + processInfo.toString());
System.out.println("Info arguments().isPresent(): " + processInfo.arguments().isPresent());
System.out.println("Info command().isPresent(): " + processInfo.command().isPresent());
System.out.println("Info totalCpuDuration().isPresent(): " + processInfo.totalCpuDuration().isPresent());
System.out.println("Info user().isPresent(): " + processInfo.user().isPresent());
}
}輸出
--------------------------- Destroy Process: --------- Id: 4384 isAlive(): true isSupportsNormalTermination(): false Info: [user: Optional[Tutorialspoint\User], cmd: C:\Program Files\Java\jdk-9.0.4\bin\java.exe, startTime: Optional[2020-03-06T10:58:53.210Z], totalTime: Optional[PT0.046875S]] Info arguments().isPresent(): false Info command().isPresent(): true Info totalCpuDuration().isPresent(): true Info user().isPresent(): true Ready to destroy Process with id: 4384 --------------------------- After destroying the process: --------- Id: 4384 isAlive(): false isSupportsNormalTermination(): false Info: [user: Optional[Tutorialspoint\User], startTime: Optional[2020-03-06T10:58:53.210Z], totalTime: Optional[PT0.109375S]] Info arguments().isPresent(): false Info command().isPresent(): false Info totalCpuDuration().isPresent(): true Info user().isPresent(): true
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP