Java 9中的进程处理

一直以来,用Java管理操作系统进程都是一项艰巨的任务。 这样做的原因是可用的工具和API较差。 老实说,这并非没有道理:Java并非出于此目的。 如果要管理OS进程,则可以使用所需的Shell,Perl脚本。 对于面临更复杂任务的大型应用程序,应该使用C或C ++编写该问题。

当您真的必须从Java管理流程时,您必须创建依赖于操作系统的代码。 有可能,您可以查询一些环境变量,然后可以根据操作系统实现不同的行为。 这种方法在Java 8之前都可以使用,但是它有几个缺点。 测试成本更高,开发更复杂。 随着Java的性质日趋广泛和广泛普及,对此类应用程序的需求也随之增加。 例如,我们可以清楚地看到,2011年在StackOverflow上提出的问题https://stackoverflow.com/questions/6356340/killing-a-process-using-java有十万多个视图。 一些应用程序以及某些开发人员都需要针对此问题的解决方案,这实际上是解决方案,而不是解决方法。

在这种情况下,在JDK中提供API是一种解决方案。 它不会使进程处理OS独立。 操作系统不同,进程处理是与操作系统密切相关的领域。 但是,代码的系统相关部分移至JDK运行时,并且Java开发团队对其进行测试,而不是对应用程序进行单独测试。 它减轻了测试方面的负担。 此外,由于该API已经存在,因此开发变得更加便宜,我们不需要针对BSD,OSX,Linux和Windows对其进行单独编程,更不用说OpenVMS了。 最后,应用程序可能运行得更快。 再举一个例子。 如果我们需要正在运行的进程的列表,那么我们必须启动一个外部进程,该进程将进程列表转储到标准输出中。 此过程的输出必须捕获并分析为字符串。 现在,随着Java 9的到来,我们将有一个简单的调用,该调用是通过调用适当的操作系统调用实现的,它不需要执行单独的进程,也不需要解析字符串输出来获取Java已经不存在了。
要了解有关Java 9流程处理的所有详细信息,您可以阅读URL http://download.java.net/java/jdk9/docs/api/overview-summary.html上当前可用的文档,或者您可以很快阅读Packt的《 精通Java 9 》一书, 网址为https://www.packtpub.com/application-development/mastering-java-9 ,其中我撰写了有关流程处理的章节。 在本文中,我将讨论一些问题,为什么我们需要新的类ProcessHandle对于那些对操作系统过程以及操作系统如何工作没有太多经验的开发人员来说,这可能不是很明显。

处理句柄

简而言之, ProcessHandle的实例代表一个操作系统进程。 所有操作系统都使用PID(一个TLA缩写“进程标识符”)标识活动进程。 这些是小(或那么小)的整数。 某些操作系统可能会使用其他名称,例如名称或一些神秘的字符串,但它们却没有使用。 没有好处,而且碰巧所有人都使用数字来标识流程。

当我们以面向对象的方式编程时,我们会抽象问题,以便更好地解释我们建模的问题。 但是有一条规则,就是我们不应使模型比问题本身更抽象。 这只是给应用增加了不必要的复杂性,增加了成本。 在这种情况下,使用int标识进程似乎是显而易见的(或完全无视)。 如果操作系统不做得更抽象,那为什么要这么做呢? 仅仅因为在Java中一切都是对象? (顺便说一句:不是。)

原因是PID和ProcessHandle实例之间没有一对一的匹配。 让我们重新阅读本节的前两个句子:

“…ProcessHandle代表操作系统进程。 所有操作系统都使用PID来识别活动进程……”

第二句话中只有一个单词“活着”,相信我,这会有所作为。 尽管我们没有直接的直接比较,但活着与死是非常不同的。 ProcessHandle实例可以保留对已从内存中擦除的进程的引用。 想象一下这样一种情况,您查看Linux上发出“ ps –ef ”命令的进程列表,然后看到Tomcat正在吞噬CPU,并且消耗的内存越来越多,这很可能是因为所部署的应用程序存在错误循环。 您决定终止该进程,以便查看所显示的pid,如果pid恰好是666 ,则发出命令“ kill -9 666 ”。 到那时,该进程已经耗尽了操作系统可能拥有的所有内存,并且由于您没有在计算机上配置任何交换文件,因此JVM消失了,没有任何跟踪。 杀死进程将抱怨没有定义的pid的进程。 也可能是操作系统已经启动了一个完全不同的进程,而该进程恰好具有该pid。 有没有发生过? 现在,您摇了摇头,这是因为在您的练习中从未发生过。 默认情况下,在Linux上,他的最大pid数是32768。 实际上时间不长,但通常不会太长,以至于在发出“ ps ”和“ kill ”命令之间可以重新使用pid。 如果小型嵌入式系统将/proc/sys/kernel/pid_max设置为较小,会发生什么。 说的更小,例如适合四个位的16? 当您以交互方式发出命令时,这可能不是一个大问题,因为您在那里,并且如果系统崩溃,则可以在需要时重新启动进程或整个系统。 如果您犯了“错误”,则可以采取纠正措施。 Java应用程序不是那么智能,即使在嵌入式系统中,我们也没有机会杀死我们不想要的进程。

基于pid的流程处理

为了处理这种情况,Java具有接口ProcessHandle 。 除了pid之外,我们还有ProcessHandle 。 如果我们需要当前正在运行的进程(JVM)的ProcessHandle ,则可以调用静态方法ProcessHandle::current (请注意,我使用了漂亮的Java 8方法句柄表示法)。 您可以在ProcessHandle实例上获取调用getPid()的当前进程的pid,但过一会儿您将无法执行此操作。 想要进程的pid只是一个老习惯。 有手柄时就不需要它。

当您具有流程句柄时,说出processHandle,您可以获取一个调用processHandle.children()的Stream。 这将列出直接的后代过程。 如果要“传递闭包”,则不仅要列出子项,还要列出子项等等,因此必须调用processHandle.descendants() 。 但是,如果您真的很贪婪,并且想在所有过程中得到帮助,该怎么办? 然后,您应该调用静态方法ProcessHandle::allProcesses
流因懒惰而闻名,仅在需要时才创建下一个元素。 在进程列表中的情况下,它会导致有趣的结果,因此在这种情况下,数据集中备份的过程流是当一个创建快照children() descendants()allProcesses()被调用。
现在,我们可以处理流程了。 我们该怎么办?

我们可以对其进行processHandle.destroy() ,也可以调用processHandle.destroyForcibly() 。 根据引用的堆栈溢出文章,这就是每个人都想要的。 我们还可以通过调用processHandle.isAlive()来检查分配给该句柄的进程是否仍处于活动状态。 您还可以访问父进程句柄(调用processHandle.parent() 。 请注意,并非所有进程都有父进程。 当父进程终止时,它们中的一个从未拥有过,并且任何其他进程可能都是孤立的。 因此,此方法的返回值是Optional 。 Java 9在Optional类中具有不错的新功能,但这是另外一回事了,这里我们重点介绍流程。

如果该进程仍然存在,但是我们要等待该进程终止,则可以采用一种现代的异步方式来完成它。 我们可以从调用processHandle.onExit()的过程句柄中获取CompletableFuture ,该过程将在过程终止时完成。 Java 9在CompletableFuture类中也具有新功能,但这是另外CompletableFuture了,这里我们将重点放在流程上。 我会重演吗?

ProcessHandle接口内部有一个称为Info的接口。 我们可以从流程句柄中调用processHandle.info()获得信息的实例。 通过此实例,我们可以访问参数(作为可选字符串数组),访问命令行(作为可选字符串),访问命令(作为字符串)以及用户也属于可选字符串。 我们还可以以可选的InstantDuration形式获取有关启动进程的信息以及有关CPU总使用量的信息。 这些新类是在Java 8中引入的,而Java 9具有新功能……好吧,它开始变得很无聊。

摘要

所有这些功能我们能做什么? 在书中,我提到我创建了一个简单的过程控制应用程序。 我不得不在2006年左右用perl创建类似的产品。 它按照配置文件中的描述启动进程,如果其中任何一个失败,它将重新启动。 但这只是一个例子。 在其他情况下,可以方便地进行处理。 您要填写表格并将其转换为PDF。 为此,您可以使用命令行参数启动一些文字处理程序。 任务正在排队,并且一个接一个地启动,以保持合理的性能,您最多可以在n个进程中转换可配置的n个文档。 如果某个过程花费的时间太长,您将其杀死,则将有关该消息的信息发送给启动请求的人员到您的转换服务器,并安排其在夜间或更不繁忙的时段运行。

我们可以使用Java开发此类程序,而无需使用外部shell,python或perl脚本,这只会使项目更简单,更便宜。

翻译自: https://www.javacodegeeks.com/2017/07/process-handling-java-9.html

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

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

相关文章

拼音缩写是啥意思_NMSL?AWSL?这些拼音缩写到底是啥意思?

我绝对没有在骂你们,我只是单纯的举个例子而已。我们在网上冲浪时经常可以看到这些几个字母组成的拼音缩写,对于知道这些梗的人一眼就能GET到,但对于不明白的人来说猜来猜去也猜不出啥意思。所以今天就来给大家科普几个经常出现的拼音缩写&am…

python利用自动识别写模块_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...

首先我只是一个接触Python约半年的菜鸟,开这一个专栏的目的主要是记录自己所学,以及实践的一些有用的东西,顺便分享一些自己写的公用代码段以方便具有同样想法的朋友。 既然是序章我就多写一些吧,我本人对人工智能在气象方面的应用…

python蟒蛇代码_011 实例2-Python蟒蛇绘制

一、"Python蟒蛇绘制"问题分析 1.1 Python蟒蛇绘制 用程序绘制一条蟒蛇 貌似很有趣,可以来试试 先学会蟒蛇绘制,再绘朵玫瑰花送给TA 设计蟒蛇的基本形状:问题1: 计算机绘图是什么原理? 一段程序为何能够产生窗体&#x…

bjd luts_BJD娃娃背后的圈层文化:一个“成品娃”拍出22万元天价!

■ 作者 黑马君 | 黑马品牌(ID:heimapinpai)现如今“Z世代”已经成为品牌营销中不可忽略的一个关键词,作为消费升级浪潮的主力军,他们早已成为品牌重点目标人群。与90后、80后不同,Z世代成长于互联网迅猛发展的时代,追…

qtcreator版本_【IDE】ROS开发环境之Qt Creator的安装与配置

可以用于ROS开发的IDE很多(可以参考【工具合辑】ROS工程师都在用什么IDE开发呢?用哪种IDE开发更加高效呢? ),ROS的调试依赖环境变量,与外部程序有通讯,因此要求启动IDE的时候加载ROS环境参数,其他方面并无太…

java线程死锁_Java并发:隐藏线程死锁

java线程死锁大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程,它们彼此永远等待。 这种情况通常是平面(同步)或ReentrantLock(读或写)锁排序问题的结果。 Found one Java-level deadlock:"pool-1-t…

空间滤波_第三章 灰度变换与空间滤波-(六)锐化空间滤波器之非锐化掩蔽

知识使人自由,印刷术使知识自由。按照书中的顺序,我们插入一章非微分模式下的锐化的方法,非锐化掩蔽。这种方法在印刷术和出版界已经用了好多年了,具体的过程:模糊原图像从原图像中减去模糊图像(产生的差值…

go语言io reader_【已解决】go语言中如何使用io的MultiWriter

【背景】折腾:期间,需要去搞懂:如果新建和设置MultiWriter。【折腾过程】1.参考:去看看:2.然后去试试代码:var filenameOnly stringfilenameOnly GetCurFilename()fmt.Println("filenameOnly", …

golang 包含文本_Golang教程之Web篇(七)

首先,大家一起思考一个问题:何为Web编程?严格来说,这只是一个叫法,并没有学术上的定义,但是一般大家都说到web都是指浏览器相关,所以大家一般说的web开发要么是PC Web要么就是手机Web&#xff0…

delphi switch语句例子_Java 14 祭出增强版 switch,真香!!

Java14:栈长,我还有机会吗?栈长:必须有!今天说下switch!关注Java技术栈的朋友应该都知道,switch 在 JDK 12 中进行增强了,并且在 JDK 12/13 中一直是预览特性,刚出来的时…

sqoop 导入到hive字段全是null_Sqoop 一点通

sqoop 是什么?sqoop 主要用于异构数据:1. 将数据从hadoop,hive 导入、导出到关系型数据库mysql 等;2. 将关系型数据库 mysql 中数据导入、导出到 hadoop 、hve 。sqoop 版本说明sqoop 1 版本主要从1.4.0 到 1.4.7;sqoop 2 版本主要…

php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP

本文实例讲述了php使用PDO操作MySQL数据库的方法。分享给大家供大家参考。具体分析如下:PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在php默认配置中pdo是未开启所以我们必须先在php.ini中开启它才可以使用,这里来详…

雅虎yql_从RSS Feed和YQL创建数据表

雅虎yqlYahoo Query Language( YQL )是一种查询语言,例如SQL。 使用YQL,我们可以跨Web服务 查询 , 过滤和联接数据。 YQL也可以阅读RSS feed。 响应可以是JSON或XML。 雅虎提供了一个YQL控制台,用于调试…

流线动态图python_Node.js Stream(流)

Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。 Node.js,Stream 有四种流类型&#xff1…

gacutil不是内部或外部命令_Win7命令提示符输入taskkill提示不是内部或外部命令...

使用win7系统的用户,想在命令提示符下使用taskkill命令删掉进程的时候,却提示taskkill不是内部或外部命令,也不是可运行的程序,遇到这样的问题,这位用户不知道怎么解决。所以给大家带来了解决方法教程,希望…

mysql两台服务器怎么做数据同步_两台mysql服务器实现双机互备配置并测试数据同步...

对于实现两台机子的互备配置,本文作出了详细的介绍,之后的测试数据同步,在10.168.1.44服务器数据库里修改一条数据, 可以看到数据已经同步过来了。反过来,修改10.168.0.126的数据,也可以看到10.168.1.44数据…

excel 复制数据 sql server 粘贴_win32 实现 excel 快速复制粘贴

直接简明说:该方法可以直接将一张代码的区域内容直接 copy 到另一张表上,并且字体颜色、背景、格式都不变,另外还可以 copy 公式(相当于 excel 下拉公式)from win32com.client import Dispatchimport win32com.clientdef writeCol(filename):…

oracle 查询过去一个星期的数据_过去一星期,最懂我的居然是一个表情包

文/黄亚男编辑/大风微信表情包上新快一周了,除了各个聊天对话框、朋友圈,蔓延到了其它社交平台。小黄脸表情伴随着微信的诞生和升级,迄今在微信上已经四次更新。每一次几乎有一个出圈的表情:第一次是“笑哭”;第二次则…

mysql的count报错_Mysql报错注入原理分析(count()、rand()、group by)

报错需要count(*),rand()、group by,三者缺一不可前提:当行数大于等于3行时才会报错。原链接:https://www.cnblogs.com/xdans/p/5412468.html几个fool()原理解释:selectcount(*),floor(rand(0)*2) from test group by …

python 从入门到实践_Python编程从入门到实践日记Day15

Python编程从入门到实践日记Day15第5章 字典(三)1.使用字典(三)—由类似对象组成的字典在前面的示例中,字典存储的是一个对象(游戏中的一个外星人)的多种信息,但你也可以使用字典来存储众多对象的同一种信息。例如,假设你要调查很多人&#x…