JDK9新特性-改进进程管理 API

Java 9 这个版本对进程管理方面的改进也是相当大的。在为数不多的几次 Java 项目中,有偶尔用到多线程,但对多进程和进程方面的了解还真是太少。

我想,大部分人应该跟我一样,在编程之外知道有进程的东西的存在,在 Java 中反而会忽视,因为多线程和并发 ( Concurrency ) 的存在感更强吧。

这次 Java 9 对进程管理的改进主要是提供了 ProcessHandle 类

ProcessHandle 类

该类在 java.lang 包中,且处于 java.base 模块中。

ProcessHandle 可以用于获取进程信息,监听和检查进程的状态,并且可以监听进程的退出

主要提供了以下几个方法


staticallProcesses()

返回当前进程可见的所有进程的快照

staticcurrent()

返回当前进程的ProcessHandle实例

staticof(longpid)

返回现有本机进程的Optional<ProcessHandle>

children()

返回进程的当前直接子进程的快照

compareTo(ProcessHandleother)

比较两个进程

descendants()

返回当前进程后代的快照

destroy()

请求杀死当前进程

destroyForcibly()

强制杀死该进程

equals(Objectother)

如果other对象为非null,且具有相同的实现,并且表示相同的系统进程,则返回true;否则返回false

hashCode()

返回此ProcessHandle的哈希值

info()

返回有关该进程的信息的快照

isAlive()

测试此ProcessHandle表示的进程是否处于活动状态

onExit()

当进程终止时返回CompletableFuture<ProcessHandle>

parent()

返回当前进程的父进程Optional<ProcessHandle>,因为当前进程可能是初始进程,所以父进程不一定存在

pid()

返回当前进程的系统进程的id

supportsNormalTermination()

如果destroy()正常终止进程,则返回true

ProcessHandle 类用于标识并提供对 native 进程的控制,可以监控每个单独的进程的活跃度,列出其子进程 ( 线程 ) ,获取有关进程的信息或将其销毁。

而很早就存在的 Process 类,它的实例由当前进程启动,只提供了对进程输入,输出和错误流的访问

native 进程 ID 是操作系统分配给进程的标识号,这个 ID 值的范围取决于操作系统,例如,嵌入式系统可能使用 16 位值。

关于这个 ProcessHandle 类,还有很多信息,如果你对此感兴趣,可以访问 官方 API 文档: Interface ProcessHandle

范例

我们写一个范例来演示下 ProcessHandle 如何使用,在当前工作区创建一个文件 ProcessHandleTester.java,并输入以下内容

[Java] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import java.time.ZoneId;

  import java.util.stream.Stream;

  import java.util.stream.Collectors;

  import java.io.IOException;

  public class ProcessHandleTester {

     public static void main(String[] args) throws IOException {

        // Windows 有效

        ProcessBuilder pb = new ProcessBuilder("notepad.exe");

        String np = "Not Present";

        Process p = pb.start();

        ProcessHandle.Info info = p.info();

        System.out.printf("Process ID : %s%n", p.pid());

        System.out.printf("Command name : %s%n", info.command().orElse(np));

        System.out.printf("Command line : %s%n", info.commandLine().orElse(np));

        System.out.printf("Start time: %s%n",

           info.startInstant().map(i -> i.atZone(ZoneId.systemDefault())

           .toLocalDateTime().toString()).orElse(np));

        System.out.printf("Arguments : %s%n",

           info.arguments().map(a -> Stream.of(a).collect(

           Collectors.joining(" "))).orElse(np));

        System.out.printf("User : %s%n", info.user().orElse(np));

     }

  }

运行该范例,输出结果如下

[Java] 纯文本查看 复制代码

?


1

2

3

4

5

6

7

[[url=mailto:yufei@www.twle.cn]yufei@www.twle.cn[/url] java9]$ javac ProcessHandleTester.java && java ProcessHandleTester

    Process ID : 5800

    Command name : C:\Windows\System32\notepad.exe

    Command line : Not Present

    Start time: 2017-11-04T21:35:03.626

    Arguments : Not Present

    User: administrator

原文地址:https://www.cnblogs.com/zhuxiaopijingjing/p/12268097.html

时间: 2024-11-02 17:15:57

JDK9新特性-改进进程管理 API的相关文章

JDK9新特性 Reactive Stream 响应式流

JDK9新特性 Reactive Stream 响应式流  本篇主要讲解 JDK9特性 Reactive Stream 响应式流,介绍 Reactive Stream是什么 背压是什么,以及JDK9中提供的关于Reactive Stream的接口和 2个使用案例包括如何使用Processor.  1.Reactive Stream 概念  Reactive Stream (响应式流/反应流) 是JDK9引入的一套标准,是一套基于发布/订阅模式的数据处理规范.响应式流从2013年开始,作为提供非阻

[Android 新特性] 改进明显 Android 4.4系统新特性解析

Android 4.3发布半年之后,Android 4.4随着新一代Nexus5一起出现在了用户的面前,命名为从之前的Jelly Bean(果冻豆)换成了KitKat(奇巧).这个新系统究竟都有怎样的改进.是否值得升级呢,下面就一次为你呈现Android 4.4 的新特性. KitKat不是老手机的救星 众所周知,Android机型一直存在升级难的问题.新版Android系统对配置的要求越来越高,特别是内 存,动辄1GB的需求,让老机型望洋兴叹.也使得很多廉价手机制造商往往更倾向于采用旧版 An

Java 8新特性之使用Stream API处理集合

1. 使用流来遍历集合 简介: Java的集合框架,如List和Map接口及Arraylist和HashMap类,让我们很容易地管理有序和无序集合.集合框架自引入的第一天起就在 持续的改进.在Java SE 8中,我们可以通过流的API来管理.遍历和聚合集合.一个基于流的集合与输入输出流是不同的. 如何工作? 它采用一种全新的方式,将数据作为一个整体,而不是单独的个体来处理.当你使用流时,你不需要关心循环或遍历的细节.你可以直接从一个集合创建一个流.然 后你就能用这个流来许多事件了,如遍历.过滤

Java 8 新特性:Java 类库的新特性之日期时间API (Date/Time API ) ——诺诺&quot;涂鸦&quot;记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  日期时间API (Date/Time API ) 1.Java8之前java.util.Date和Calendar类的弊端 1)最开始的时候,Date既要承载日期信息,又要做日期之间的转换,还要做不同日期格式的显示,职责较繁杂(不遵守单一职责). 后来从JDK 1.1 开始,这三项职责分开了: 使用Calendar类实现日期和

c++11 多线程新特性学习 (1) 管理线程

1.基础介绍 c++11中,线程是通过std::thread对象来开始的,用法为 #include<thread> //必须包含的头文件 void do_work(){ std::cout<<"Hello World"; } int main(){ std::thread my_thread(do_work); } 这样就开启了一个新线程,并且运行的是do_work这个函数 要注意的是当给线程构造函数传递一个临时的且未命名的变量,要用新的方法如下 #includ

java8新特性七-Date Time API

简介 Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一. 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义.java.util.Date同时包含日期

java9新特性-16-Deprecated的相关API

1.官方Feature 211: Elide Deprecation Warnings on Import Statements 214: Remove GC Combinations Deprecated in JDK 8 277: Enhanced Deprecation 289: Deprecate the Applet API 291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector 2.使用说明 Java 9 废弃

JDK 5 ~ 10 新特性倾情整理!

JDK 5 ~ 10 新特性倾情整理! 最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了. 为了大家对JDK有一个全面的了解,下面我为大家整理了JDK5~10的所有关键新特性! JDK5新特性 自动装箱与拆箱 枚举 静态导入 可变参数(Varargs) 内省(introspector) 泛型(Generic) For-Each循环 JDK6新特性 Desktop类和SystemTray类 使用JAXB2来

atitit.Windows Server 2003 2008 2012系统的新特性 attilax 总结

atitit.Windows Server 2003  2008  2012系统的新特性 attilax 总结 1. Windows Server 2008 新特性也可以归纳为4个方面. 1 2. 相比Windows Server 08,R2 2 3. win 2012  新特性 2 4. 参考 6 1. Windows Server 2008 新特性也可以归纳为4个方面. 即将发布的Windows Server 2008是企业级的应用平台,可以为CRM等企业级应用提供更好更强的支撑,其新特性也