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() |它返回该进程的用户。 |