Java 9 - 进程API改进

时间:2020-02-23 14:34:55  来源:igfitidea点击:

在本教程中,我们将看到Java 9进程API改进。
Java在Java 9版本中改进了其进程API,其中包括新方法 Process class和两个新的接口 ProcessHandleProcessHandle.Info
这些方法用于创建新进程并获取处理信息,如进程状态,运行时间,进程ID等。
我们还可以获得当前的运行进程及其信息。

进程类

java. Process类位于 java.lang package并提供控制流程的方法 ProcessBuilder.startRuntime.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() |它返回该进程的用户。 |