在Java 9中,Process 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[Nhooo\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[Nhooo\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