进程 API 改进

原文:https://www.studytonight.com/java-9/process-api-improvement

Java 在 Java 9 版本中通过在 process 类中添加新的方法以及 ProcessHandle 和 ProcessHandle.Info 这两个新接口,对其 process API 进行了改进

它有助于控制和管理流程,无论是基于操作系统的流程还是应用流程。我们可以创建流程,获取有关流程的信息,如流程 id、所有者姓名、等待时间、流程状态等。

进程 API 中的两个新接口:

  • java.lang.ProcessHandle
  • java.lang.ProcessHandle.Info

Java 中的 Process 类提供了几种方法来处理流程并执行操作,如检查等待流程完成、检查流程的退出状态以及销毁(杀死)流程等。

以下是在 Java 9 版本中添加到 Process 类的一些方法。

Java 进程类方法(仅限 Java 9 方法)

| 方法 | 描述 | | 布尔支持 sNormalTermination() | 如果 destroy()的实现是正常终止进程,则返回 true,否则返回 false。 | | ProcessHandle toHandle() | 它为进程返回一个进程句柄。 | | 长 pid() | 它返回进程的本机进程标识。 | | 流子() | 它返回进程的直接子进程的快照。 | | 流后代() | 它返回进程后代的快照。 | | processhandle.info() | 它返回进程信息的快照。 | | 可完成的未来〔t0〕one success() | 它返回一个完整的未来来终止进程。 |

示例:查找流程标识

让我们通过一个简单的例子来理解流程处理。这里,我们使用 process 类的 pid()方法获取进程 id。

public class Main { 
    public static void main(String[] args){
        ProcessHandle currentProcess = ProcessHandle.current();
        System.out.println("Process Id: "+currentProcess.pid());    
    }
}

流程编号:16458

Java 进程句柄接口

Java 添加了这个接口来识别和控制本地进程。获取子进程列表、进程信息或销毁进程等都是很有帮助的。下面给出了该方法的语法。

public interface ProcessHandle extends Comparable<ProcessHandle>

接口方法

以下是进程句柄接口的方法。它包含一个名为“信息”的嵌套接口。

| 方法 | 描述 | | 静态流所有进程() | 它返回当前进程可见的所有进程的快照。 | | 流子() | 它返回进程的当前直接子进程的快照。 | | (同 Internationalorganizations)国际组织

| 比较(其他进程句柄) | |

| 它将此进程句柄与订单的指定进程句柄进行比较。 | | 静态进程句柄电流() | 它返回当前进程的进程句柄。 | | 流后代() | 它返回进程后代的快照。 | | 布尔销毁() | 它请求终止进程。 | | 布尔型强制销毁() | 它请求强行杀死进程。 | | 布尔等于(对象其他) | 如果其他对象为非空,具有相同的实现,并且表示相同的系统进程,则返回 true 否则它返回假。 | | int hashCode() | 它返回该进程句柄的哈希代码值。 | | processhandle.info() | 它返回进程信息的快照。 | | boolean isAlive() | 它测试这个 ProcessHandle 表示的进程是否是活动的。 | | 静态可选的(长 pid) | 它为现有的本机进程返回一个可选的 | | 可完成的未来〔t0〕one success() | 它返回一个 CompletableFuture 来终止该进程。 | | 可选父项() | 它为父进程返回一个可选的 | | 长 pid() | 它返回进程的本机进程标识。 | | 布尔支持 sNormalTermination() | 如果 destroy()的实现通常会终止进程,则返回 true。 |

在前面的例子中,我们获取了当前正在运行的进程的进程 id。然而,我们可以自己开始一个新的进程并处理它。

示例:在 Linux 中启动虚拟仪器编辑器

现在,让我们使用 ProcessBuilder 类的 start()方法创建一个新的进程。这里,我们在 Linux 中启动 vim 编辑器的一个进程,并使用 pid()方法获取进程 id。

public class Main { 
    public static void main(String[] args) throws IOException{
         Process p = new ProcessBuilder("vim").start();
          System.out.println(p.pid()); 
    }
}

13834

示例:进程信息

这个例子解释了我们如何获得一个进程的信息。我们使用了进程类的 pid()、isAlive()、info()、hashCode()等方法。

import java.io.IOException;

public class Main { 
    public static void main(String[] args) throws IOException{
         Process p = new ProcessBuilder("vim").start();
         // Get process ID
         System.out.println(p.pid());
         // Check is Alive?
         System.out.println(p.isAlive());
         // Get process Info
         System.out.println(p.info());
         // Get Hahscode
         System.out.println(p.hashCode());
         // Get child process
         System.out.println(p.children());
         // Get className
         System.out.println(p.getClass());
    }
}

14413 true 【用户:可选【root】,cmd: /usr/bin/vim.basic,startTime:可选【2020-07-23T19:02:42.310Z】,totalTime:可选【PT0S】】 1418481495 Java . util . stream . referencepipeline $ 2 @ 65ab 7765 class Java . lang . processimpl

Java ProcessHandle。信息界面

该界面提供了有关该进程的信息快照。它是 ProcessHandle 接口的嵌套接口。每个操作系统的进程属性并不相似,并且在所有实现中都不可用。有关进程的信息受到发出请求的进程的操作系统权限的限制。这个接口的签名如下。

public static interface ProcessHandle.Info

ProcessHandle。信息方法

下面是 ProcessHandle.info 接口的方法,它是一个静态的嵌套接口

| 方法 | 描述 | | 可选参数() | 它返回进程参数的字符串数组。 | | 可选命令() | 它返回进程的可执行路径名。 | | 可选命令行() | 它返回进程的命令行。 | | 可选起始符号() | 它返回进程的开始时间。 | | 可选totalcpudduration() | 它返回进程累计的总 CPU 时间。 | | 可选 用户() | 它返回进程的用户。 |

示例:

这里,我们使用的是 ProcessHandle。获取进程信息的接口方法。

import java.io.IOException;
import java.time.Duration;

public class Main { 
    public static void main(String[] args) throws IOException{
        ProcessHandle.Info info = ProcessHandle.current().info();
        System.out.println(info.arguments());
        System.out.println(info.command().orElse("Not Found"));
        String[] argz = info.arguments().orElse(new String[] {});
        for (String arg: argz)
             System.out.printf("   %s%n", arg);
        System.out.println("Owner: "+info.user());
        System.out.println("RunTime: "+info.totalCpuDuration().orElse(Duration.ofMillis(0)).toMillis());

    }
}

可选[[ljava . lang . string;@ 1f 32 e 575] /usr/lib/JVM/Java-11-openjdk-amd64/bin/Java -dfile . encoding = UTF-8 -类路径 /home/root/eclipse/myjavaproject/bin:/home/root/Downloads/mongo-Java-driver-3 . 12 . 4 . jar:/home/root/Downloads/opencsv-3 . 8 . jar:/home/root/Downloads/commons-logging-1.2/commons 主 所有者:可选【根】 运行时间:100