Java 9 - 进程API改进
在本教程中,我们将看到Java 9进程API改进。
Java在Java 9版本中改进了其进程API,其中包括新方法 Process class和两个新的接口 ProcessHandle和 ProcessHandle.Info。
这些方法用于创建新进程并获取处理信息,如进程状态,运行时间,进程ID等。
我们还可以获得当前的运行进程及其信息。
进程类
java. Process类位于 java.lang package并提供控制流程的方法 ProcessBuilder.start和 Runtime.exec。
启动新的进程?
我们可以调用 start()的方法 ProcessBuilder类开始新的进程。
它将返回一个实例 Process进一步可用于获取与进程相关信息的类。
Process process = new ProcessBuilder("vim").start(); //vim is an editor in Linux
方法
虽然 Process类包含多种方法,但在这里我们列出了添加到Java 9版本中的新方法。
| 方法 | 描述 |
|---|---|
| Boolean SupportSnorMalterMination() | 如果Destroy()的实现是通常终止该进程,则返回True,否则返回FALSE。 |
| processhandle tohandle() | 它返回该进程的ProcessHandle。 |
| Long PID() | 它返回进程的本机进程ID。 |
| Stream children() | 它返回该进程的直接子女的快照。 |
| Stream descendants() | 它返回该进程后代的快照。 |
| processhandle.info info() | 它返回有关该进程的信息的快照。 |
| CompletableFuture onExit() | 它返回了终止进程的完整文件。 |
获取进程ID的示例
创建进程后(在上面的示例中),我们正在使用进程ID pid()的方法 Process类。
请参阅下面的示例。
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException {
Process process = new ProcessBuilder("vim").start();
//Get process id
System.out.println(process.pid());
}
}
输出
Process Id: 10754
获取进程信息示例
以下是一个示例,用于获取有关哈希码,子进程和类等进程的更多信息。
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException {
Process process = new ProcessBuilder("vim").start();
//Get created process info
System.out.println(process.pid());
System.out.println(process.info());
System.out.println(process.hashCode());
System.out.println(process.isAlive());
System.out.println(process.children());
System.out.println(process.getClass());
System.out.println(process.descendants().count());
}
}
输出
15066 [user: Optional[irfan], cmd: /usr/bin/vim.basic, startTime: Optional[2017-09-17T07:50:15.080Z], totalTime: Optional[PT0S]] 1418481495 true java.util.stream.ReferencePipeline@65ab7765 class java.lang.ProcessImpl 0
ProcessHandle接口
此接口将添加到Java 9中以提供对本机或者创建的进程的控制。
它为进程处理提供了另外的支持。
我们可以使用它 current()获取当前进程处理程序的方法。
让我们看一个例子。
public class Main{
public static void main(String[] args) {
ProcessHandle processHandle = ProcessHandle.current(); //current process
System.out.println("Process Id: "+processHandle.pid());
}
}
输出
Process Id: 17044
方法
以下是方法 ProcessHandle接口。
| 方法 | 描述 |
|---|---|
| static Stream allProcesses() | 它返回当前进程可见的所有进程的快照。 |
| Stream children() | 它返回流程的当前直接子女的快照。 |
| int compareTo(ProcessHandle other) | 它将此ProcessHandle与订单进行指定的ProcessHandle进行了比较。 |
| static ProcessHandle current() | 它返回当前进程的ProcessHandle。 |
| Stream descendants() | 它返回该进程后代的快照。 |
| boolean destroy() | 它请求杀死的进程。 |
| boolean destroyForcibly() | 它要求强行杀死的进程。 |
| boolean equals(Object other) | 如果其他对象是非空,则返回true,其实现是相同的,并且表示相同的系统进程;否则它返回false。 |
| int hashCode() | 它返回此ProcessHandle的哈希码值。 |
| ProcessHandle.Info info() | 它返回有关该进程的信息的快照。 |
| boolean isAlive() | 它测试此ProcessHandle表示的进程是否存在。 |
| static Optional of(long pid) | 它返回现有本机进程的可选。 |
| CompletableFuture onExit() | 它返回了终止进程的完整文件。 |
| Optional parent() | 它返回父进程的可选。 |
| long pid() | 它返回进程的本机进程ID。 |
| boolean supportsNormalTermination() | 如果Destroy()的实现通常终止该进程,则返回true。 |
例子
我们将使用 ProcessHandle接口获取当前正在运行的进程的更多信息。
public class Main{
public static void main(String[] args) {
ProcessHandle processHandle = ProcessHandle.current();
System.out.println("Get Process Info: ");
System.out.println("Process Id: "+processHandle.pid());
ProcessHandle.Info pHandleInfo = processHandle.info();
System.out.println(pHandleInfo.arguments().isPresent());
System.out.println(pHandleInfo.arguments().isEmpty());
System.out.println(pHandleInfo.command().isPresent());
System.out.println(pHandleInfo.totalCpuDuration().get());
//process user name
System.out.println(pHandleInfo.user().get());
}
}
输出
Process Id: 12437 true false true PT0.11S irfan
processhandle.info接口方法
这是一个嵌套接口 ProcessHandle接口并用于提供支持 Process处理。
|方法|描述|
| Optional arguments()|它返回一个进程参数的字符串数组。 |
| Optional command() |它返回进程的可执行路径名。 |
| Optional commandLine() |它返回进程的命令行。 |
| Optional startInstant() |它返回进程的开始时间。 |
| Optional totalCpuDuration() |它返回累计的进程的总渗透率。 |
| Optional user() |它返回该进程的用户。 |

