【java9】java9新特性之改进进程管理API

news2024/10/7 10:21:20

在这里插入图片描述

Java9在改进进程管理API方面,主要的更新在于引入了ProcessHandle接口,该接口代表了一个本地进程,并提供了许多与进程相关的信息和操作。

通过ProcessHandle接口,开发者可以获取进程的ID、父进程、子进程、进程命令行参数、进程状态等信息。

具体来说,ProcessHandle接口提供了一系列方法来获取进程的信息,例如pid()用于获取进程ID,info()用于获取进程的详细信息,parent()用于获取父进程的ProcessHandle,children()用于获取子进程的ProcessHandle数组等。

此外,ProcessHandle接口还支持对进程的监控。开发者可以使用onExit()方法注册一个回调,当进程退出时,系统会自动调用该回调,从而允许在进程退出时执行一些特定的操作。

总的来说,Java9在进程管理API方面的改进,使得开发者能够更方便地获取进程信息,并对进程进行更细致的管理和监控。

ProcessHandle类的介绍

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

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

主要提供了以下几个方法:

  • allProcesses():返回当前进程可见的所有进程的快照
  • current():返回当前进程的ProcessHandle实例
  • of(long pid):返回现有本机进程的Optional
  • children():返回进程的当前直接子进程的快照
  • compareTo(ProcessHandle other):比较两个进程
  • descendants():返回当前进程后代的快照
  • destroy():请求杀死当前进程
  • destroyForcibly():强制杀死该进程
  • info():返回有关该进程的信息的快照
  • isAlive():测试此ProcessHandle表示的进程是否处于活动状态
  • onExit():当进程终止时返回CompletableFuture
  • parent():返回当前进程的父进程Optional,因为当前进程可能是初始进程,所以父进程不一定存在
  • pid():返回当前进程的系统进程的id
  • supportsNormalTermination():如果destroy()正常终止进程,则返回true

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

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

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

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

ProcessHandle类的使用

package com.morris.java9;

import java.io.IOException;
import java.util.stream.Stream;

/**
 * ProcessHandle类的使用
 */
public class ProcessHandleDemo {
    public static void main(String[] args) throws IOException, InterruptedException {

        // 获取当前进程的 ProcessHandle
        ProcessHandle currentProcess = ProcessHandle.current();
        long pid = currentProcess.pid();
        System.out.println("Current Process ID: " + pid);

        // 获取进程启动时的命令行参数
        System.out.println("Command line arguments: " + currentProcess.info().arguments());

        // 遍历所有进程
        Stream<ProcessHandle> allProcesses = ProcessHandle.allProcesses();
        allProcesses.forEach(process -> {
            System.out.println("Process ID: " + process.pid());
            System.out.println("Command: " + process.info().command().orElse("Unknown"));
        });

        // 启动一个子进程
        ProcessBuilder processBuilder = new ProcessBuilder("ping", "www.baidu.com");
        Process process = processBuilder.start();

        // 监听进程退出
        // onExit for current process not allowed
        process.toHandle().onExit().thenAccept(exitValue -> System.out.println("Process exited with code: " + exitValue));

        // 获取进程的子进程
        Stream<ProcessHandle> children = currentProcess.children();
        children.forEach(child -> System.out.println("Child Process ID: " + child.pid()));

        // 在命令行kill上面的子进程
        Thread.sleep(100 * 1000);
    }
}

运行结果如下:

$ java com.morris.java9.ProcessHandleDemo
Current Process ID: 755
Command line arguments: Optional[[Ljava.lang.String;@6fb554cc]
Process ID: 1
Command: /usr/lib/systemd/systemd
Process ID: 2
Command: /usr/bin/su
Process ID: 3
Command: /usr/bin/bash
Process ID: 60
Command: /usr/lib/systemd/systemd-journald
Process ID: 89
Command: /usr/lib/systemd/systemd-udevd
Process ID: 94
Command: /usr/lib/systemd/systemd-networkd
Process ID: 249
Command: /usr/lib/systemd/systemd-resolved
Process ID: 252
Command: /usr/lib/accountsservice/accounts-daemon
Process ID: 253
Command: /usr/bin/dbus-daemon
Process ID: 256
Command: /usr/bin/python3.8
Process ID: 258
Command: /usr/lib/policykit-1/polkitd
Process ID: 260
Command: /usr/sbin/rsyslogd
Process ID: 261
Command: /usr/lib/systemd/systemd-logind
Process ID: 263
Command: /usr/lib/udisks2/udisksd
Process ID: 289
Command: /usr/sbin/cron
Process ID: 293
Command: /usr/bin/python3.8
Process ID: 294
Command: /usr/bin/containerd
Process ID: 295
Command: /usr/sbin/atd
Process ID: 303
Command: /usr/sbin/ModemManager
Process ID: 311
Command: /usr/sbin/agetty
Process ID: 315
Command: /usr/sbin/agetty
Process ID: 318
Command: /usr/sbin/sshd
Process ID: 339
Command: /usr/bin/dockerd
Process ID: 362
Command: /usr/bin/containerd-shim-runc-v2
Process ID: 383
Command: /docker-volume-sshfs
Process ID: 687
Command: /usr/bin/su
Process ID: 689
Command: /usr/lib/systemd/systemd
Process ID: 690
Command: /usr/lib/systemd/systemd
Process ID: 695
Command: /usr/bin/bash
Process ID: 755
Command: /root/soft/jdk-9.0.4/bin/java
Child Process ID: 789
Process exited with code: 789

在操作系统层面也能看到这个进程:

$ ps -ef|grep 716
root         716       3  0 14:34 pts/0    00:00:00 java com.morris.java9.ProcessHandleDemo
root         754     695  0 14:36 pts/1    00:00:00 grep --color=auto 716

$ ps -ef|grep 755
root         755       3  1 14:36 pts/0    00:00:00 java com.morris.java9.ProcessHandleDemo
root         789     755  0 14:36 pts/0    00:00:00 ping www.baidu.com
root         792     695  0 14:36 pts/1    00:00:00 grep --color=auto 755

$ kill 789

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1637785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT——简易计算机(从0开始)

目录 一、题目描述&#xff1a; 二、创建工程&#xff1a; 三、UI界面设计&#xff1a; 四、程序编写&#xff1a; 五、总程序&#xff1a; 六、windows可执行文件 七、实现效果 一、题目描述&#xff1a; 创建一个简单的图形用户界面(GUI),包括一个文本框用于显示计算结…

ctfshow-web入门-102

这个题我想记录一下&#xff0c;主要是这个方法属实是有点惊艳到我了。故而进行记录&#xff0c;也为了方便大家阅读理解。 看题目&#xff0c;根据题目我写一下我的分析&#xff1a; $_POST传入一个v1&#xff0c;$_GET传入一个v2&#xff0c;一个v3。 赋值符号 优先级高于…

谷粒商城实战(021 业务-订单模块-页面设计)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第262p-第p266的内容 介绍 所需的页面 设计页面 新增域名 路径带/static的都到/usr/share/nginx/html文件夹下去找 其他动态请求的都负载…

2024年第二十一届 五一杯 (C题)大学生数学建模挑战赛 | 多目标优化问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 首先&…

Mac M2 本地下载 Xinference

想要在Mac M2 上部署一个本地的模型。看到了Xinference 这个工具 一、Xorbits Inference 是什么 Xorbits Inference&#xff08;Xinference&#xff09;是一个性能强大且功能全面的分布式推理框架。可用于大语言模型&#xff08;LLM&#xff09;&#xff0c;语音识别模型&…

【已解决】pandas读excel中长数字变成科学计数法的问题

pandas 读excel中的长数字时&#xff0c;即使excel中已经设置为文本&#xff0c;读进df后也会自动变成科学计数法。 在日常的数据分析和处理工作中&#xff0c;Excel和pandas是数据分析师们不可或缺的得力助手。然而&#xff0c;在使用pandas读取Excel文件时&#xff0c;我们有…

基于残差神经网络的汉字识别系统+pyqt前段界面设计

研究内容: 中文汉字识别是一项具有挑战性的任务&#xff0c;涉及到对中文字符的准确分类。在这个项目中&#xff0c;目标是构建一个能够准确识别中文汉字的系统。这个任务涉及到数据集的收集、预处理、模型训练和评估等步骤。尝试了使用残差神经网络&#xff08;ResNet&#x…

Rust Rocket创建第一个hello world的Web程序 Rust Rocket开发常用网址和Rust常用命令

一、Rust Rocket简介 Rust Rocket 是一个用 Rust 语言编写的 Web 应用框架&#xff0c;它结合了 Rust 的安全性和性能优势&#xff0c;以及 Web 开发的便利性。以下是 Rust Rocket 框架的一些优点&#xff1a; 安全性&#xff1a;Rust 是一种注重安全性的编程语言&#xff0c;…

【前端探索者:从零到精通的Web前端实战专栏】

🚀 在这个代码编织梦想的时代,Web前端作为互联网的颜值担当,正以日新月异的速度重塑数字世界。想要在前端江湖里游刃有余,你需要的不仅仅是一把锋利的剑,更是一套完整的武功秘籍!今天,我们就为你揭开【Web前端】专栏的神秘面纱,带你从菜鸟到大神,一飞冲天! 📚 专栏…

Text-to-SQL小白入门(12)Awesome-Text2SQL开源项目star破1000

项目介绍 项目地址 23年9月份刚开源这个项目&#xff0c;大半年过去了&#xff0c;star数终于破1000啦&#xff0c;决定在知乎更新一下内容&#xff0c;看看内容变化&#xff0c;知乎有上当时项目介绍的链接&#xff1a;追光者&#xff1a;Text-to-SQL小白入门&#xff08;六&…

【Qt QML】Frame组件

Frame&#xff08;框架&#xff09;包含在&#xff1a; import QtQuick.Controls继承自Pane控件。用于在可视框架内布局一组逻辑控件。简单来说就是用来包裹和突出显示其他可视元素。Frame不提供自己的布局&#xff0c;但需要自己对元素位置进行设置和定位&#xff0c;例如通过…

Spring Boot Admin

概述 Spirng Boot Admin 登录页面 Spring Boot Admin是一个用于管理Spring Boot应用的监控工具,它允许你查看和管理多个Spring Boot应用实例。用于应用信息进行界面化的展示&#xff0c;常常辅助我们开发人员快速查看服务运行状态在微服务架构中&#xff0c;Spring Boot Admin通…

【linux】进程(深入理解linux进程状态)

开始之前先说一个与本文无关的小知识&#xff0c;chdir命令可以更改当前进程的工作目录哦。 目录 linux具体进程状态&#xff1a;R && S&#xff1a;T && t&#xff1a;D&#xff1a;僵尸进程 && 孤儿进程&#xff1a; OS的理论线&#xff1a;运行&…

JMeter性能压测脚本录制

第一步&#xff1a;电脑打开控制面板设置代理服务器 第二步&#xff1a;jmeter的测试计划添加一个HTTP&#xff08;S&#xff09;脚本记录器 在脚本记录器里配置好信息&#xff0c;然后保存为脚本文件&#xff08;.*表示限定&#xff09; 此方框内容为项目地址&#xff08;可改…

如何安装cuda版本的torch-sparse和torch-scatter

安装对应cuda版本的torch&#xff0c;确保cuda可用 使用nvidia-smi查看cuda版本&#xff0c;我的是11.4&#xff0c;然后就找到pytorch历史版本&#xff0c;页面搜索cuda 11.4&#xff0c;没搜到&#xff0c;继续往小版本搜&#xff0c;搜到cuda 11.3&#xff0c;果断安装&…

日拱一卒,月进一步(10)

303. 区域和检索 - 数组不可变 - 力扣&#xff08;LeetCode&#xff09; 动态规划~ 前缀和 最朴素的思想是存储数组nums的值&#xff0c;每次调用sumRange时&#xff0c;通过循环的方法计算数组nums从下标i到下标j的元素和&#xff0c;需要计算j-i1个元素的和。由于每次检索…

Sobel算法:边缘提取的原理与实践【基于python、C++基于opencv的代码实现!!】

Sobel算法&#xff1a;深入解析边缘检测的原理与实现 在图像处理领域&#xff0c;边缘检测是一项至关重要的任务。其中&#xff0c;Sobel算法以其高效和稳定的性能&#xff0c;成为边缘检测中的常用方法之一。本文将深入解析Sobel算法的原理与实现&#xff0c;带您了解如何通过…

02_机器学习算法_基于XGBoost的分类预测

1. XGBoost 算法 1.1 XGBoost 的介绍 XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统。严格意义上讲XGBoost并不是一种模型,而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型,并对模型中的算法进行了诸多…

通过先序和中序求后序(通过后序和中序求先序)

一、通过先序和中序求后序 二、通过后序和中序求后序 1、利用后序和中序的特点来求出二叉树 2、后序输出二叉树 如图&#xff0c;先给了一个后序和中序&#xff0c;后序的最后一个为根节点 然后在中序中查找相同的元素&#xff0c;在这个元素左边的为左子树&#xff0c;右…

最简方式安装oracle 23c free

简介 我一直认为&#xff0c;最靠谱的文档就是原厂官网的文档&#xff0c;阅读再次加工的文档都有可能把你带偏。 oracle官网提供了大量的文档&#xff0c;一个好的oracle使用者&#xff0c;应该首先是好的oracle官网阅读者。 oracle数据库作为收费颇贵的商业数据库软件&#…