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

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

  1. JDK9 新特性

    JDK9 新特性目录导航 目录结构 模块化系统 jshell 多版本兼容JAR 接口的私有方法 改进try-with-resourcs 改进砖石操作符 限制使用单独下划线标识符 String存储结构变 ...

  2. JDK9新特性实战:流关闭新姿势

    做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能. 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化. JDK6 在JDK ...

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

    Android 4.3发布半年之后,Android 4.4随着新一代Nexus5一起出现在了用户的面前,命名为从之前的Jelly Bean(果冻豆)换成了KitKat(奇巧).这个新系统究竟都有怎样的 ...

  4. jdk9新特性之jShell

    jdk9还没研究完,结果jdk10都停止维护了. 最近回顾jdk9,发现了一个新特性--jShell. jdk9是在2017年的9月份发布的,这是我开始感觉入门java的时间.从jdk10开始就是半年 ...

  5. JDK9新特性实战:简化流关闭新姿势。

    做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能. 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化. JDK6 在JDK ...

  6. java8新特性七-Date Time API

    Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: 非线程安全 − java.ut ...

  7. Java8新特性之三:Stream API

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

  8. JAVA 8 主要新特性 ----------------(六)集合Stream API

    一.简介Stream Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一 个则是 Stream API(java.util.stream.*).Stream 是 Java8 中处 ...

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

    1.基础介绍 c++11中,线程是通过std::thread对象来开始的,用法为 #include<thread> //必须包含的头文件 void do_work(){ std::cout ...

随机推荐

  1. shell中获取文件目录方法

    1.``:表示执行对应的命令,嵌套时使用`\`\``,注意\进行转义,同时执行多个命令时使用:隔开file=`cd "\`dirname $0\`";pwd`echo $file ...

  2. 每天一杯C_C89、C99、C11等之C语言标准

    C语言的伟大之处在于C语言还是一个国际标准,这只“无形的手”掌控者其他派生语言和计算机的各个方面.起关于C语言被发明之后,ANSI和ISO相继发布关于C语言的标准.关于C90和C99,C89和C99容 ...

  3. Paper Review: Epigenetic Landscape, Cell Differentiation 02

    I'll share another review paper about Epigenetic Landscape, it comes from Nature Review, published i ...

  4. 基于SpringBoot框架企业级应用系统开发全面实战

    Eclipse 安装spring-tool-suite教程,并创建一个新的springboot项目 使用SpringBoot构建项目,加载SSM整合的applicationContext.xml的注解 ...

  5. UML-逻辑架构&包图-相关概念

    1.逻辑架构 软件的宏观组织结构.含: 1).包 2).子系统 3).层 2.层 对类.包.子系统的分组(内聚).例如:mvc.在OOA/D中要重点关注核心应用逻辑(或领域)层. 3.UML包图 描述 ...

  6. python3.x设置默认编码(sys.stdout.encoding和sys.defaultencoding)

    查了一会资料得出的结论是如果你用的是python3.x,那么就最好别去设置sys.defaultencoding或者sys.stdout.encoding记住在需要编码的时候用encode,解码的时候 ...

  7. day59-mysql-存储过程、函数、事务、锁、备份

    存储过程.函数不是重要的内容. 三. 存储过程:类似于函数(方法),简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集合, 该语句集包括SQL语句(对数据的增删改查).条件语句和循环语句等 ...

  8. python字符串——"奇葩“的内置函数

      一.前言 python编程语言里的字符串与我们初期所学的c语言内的字符串还是有一定不同的,比如python字符串里的内置函数就比语言的要多得多:字符串内的书写格式也会有一点差异,例:字符串内含有引 ...

  9. linux安装nginx步骤

    转载自:https://blog.csdn.net/t8116189520/article/details/81909574,修改部分内容 本文已收录至博客专栏linux安装各种软件及配置环境教程中 ...

  10. JS 特效三大系列总结

    一. offset系列 1. offset系列的5个属性 1. offsetLeft : 用于获取元素到最近的定位父盒子的左侧距离 * 计算方式: 当前元素的左边框的左侧到定位父盒子的左边框右侧 * ...