java事件处理过程分布写_Java 9中的进程处理

java事件处理过程分布写

一直以来,用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标识活动进程,PID是TLA的缩写,进程标识符。 这些是小(或那么小)的整数。 某些操作系统可能会使用其他名称,例如名称或一些神秘的字符串,但它们不会使用。 没有好处,而且碰巧所有人都使用数字来标识流程。

当我们以OO方式编程时,我们将问题抽象化,以便更好地解释我们建模的问题。 但是有一条规则,就是我们的模型不应比问题本身更抽象。 这只是给应用增加了不必要的复杂性,增加了成本。 在这种情况下,使用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

java事件处理过程分布写

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

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

相关文章

mac mysql5.7.9 dmg_Mac 安装 mysql5.7

mac 安装msql 5.7最近使用Mac系统,准备搭建一套本地web服务器环境。因为Mac系统没有自带mysql,所以要手动去安装mysql,本次安装mysql最新版5.7.28。安装步骤参考以下博客https://www.jianshu.com/p/71f81a0c62b2安装成功后,因为密…

安卓系统dicom阅读器_用户分享:电子书阅读器Note Pro,一座贴心的移动图书馆...

本文转载自“什么值得买”官网用户“小良读书”,经作者授权转载。Note Pro,一座贴心的移动图书馆移动图书馆貌美的小书郎10.3寸高清大屏更适合专业书籍的阅读如果说多年前入手了一台kindle paperwite3电纸书阅读器,它让我畅游了书籍的江河&am…

vim 编辑器命令整理

文章目录一、基本使用流程二、普通命令模式(一)切换到插入模式(编辑/写入/输入)(二)切换到可视模式(选择文本模式)(三)切换至底行命令模式(四&…

mysql f_MySQL

医生给病人诊断的时候,一般会使用听诊器来诊断肺部是否正常。如果你的MySQL出现了性能问题,第一个需要“诊断”的就是slow log(慢日志)了。slow log文件很小,使用more less等命令就足够了。如果slow log很大怎么办?这里介绍MySQL自…

activiti dmn_端到端BPM(带有DMN标记)

activiti dmn下周的红帽峰会即将成为有史以来最好的峰会之一! 而且,如果您是Drools或jBPM的狂热者,您会很忙 :Signavio和Red Hat之间的合作伙伴关系是我们为您准备的另一个顶级演讲。 邓肯道尔(Duncan Doyle&#xff…

python计算两个点之间的距离_python实现两个经纬度点之间的距离和方位角的方法...

最近做有关GPS轨迹上有关的东西,花费心思较多,对两个常用的函数总结一下,求距离和求方位角,比较精确,欢迎交流!1. 求两个经纬点的方位角,P0(latA, lonA), P1(latB, lonB)(很多博客写的不是很好&…

netbeans 9_NetBeans 9抢先体验

netbeans 9Java 9即将来临,NetBeans 9也即将来临。在本文中,我们将看到NetBeans 9 Early Access为开发人员提供的支持,以帮助他们构建Java 9兼容的应用程序。 Java 9提供了许多(大约90种) 新功能,包括模块…

同一个ip能否两次加入组播_组播IGMPv1/v2/v3精华知识汇总

闲言少叙,直奔主题,开说之前先做点铺垫,回顾一下网络的基础知识。D类地址划分回顾组播是IPv4地址分类中的D类,我们回顾一下IPv4的地址划分A类:首bit0,0-127网段,网络掩码8,其中0.0.0…

命令(CMD)终端的清屏(清除/清空)命令/快捷键

Windows CMD 或者 Navicat 命令窗口的清屏命令:Clear 或者 CLS MacBook 命令终端的清屏命令/快捷键:CtrlCmdL(清除屏幕) ,CmdK(清除到开头),Clear ,CtrlL Linux 命令终…

弹窗要打开或保存来自_如何让 PopClip 支持印象笔记客户端:保存到印象笔记amp;高亮文字...

自从印象笔记品牌独立并发布新APP后,Mac系统下很多工具不再支持与印象笔记客户端进行联动,PopClip 就是其中之一。目前 Popclip 官方并未将印象笔记加入到插件的支持中,不过我们可以手动修改来解决这个问题。Popclip 之所以不支持新版本的印象…

vue 混入对象_特性和混入不是面向对象的

vue 混入对象让我立刻说,我们将在这里讨论的功能是那些迫切需要进行放线手术的人带给面向对象编程的纯粹的毒药 ,就像David West在他的《 Object Thinking》一书中所建议的那样。 这些功能具有不同的名称,但是最常见的是traits和mixins 。 我…

glup node 内存不够_Redis:内存被我用完了!该怎么办?

介绍Redis是一个内存数据库,当Redis使用的内存超过物理内存的限制后,内存数据会和磁盘产生频繁的交换,交换会导致Redis性能急剧下降。所以在生产环境中我们通过配置参数maxmemoey来限制使用的内存大小。当实际使用的内存超过maxmemoey后&…

Windows应用程序启动命令汇总

winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构(WMI) wupdmgr--------windows更新程序 wscript--------windows脚本宿主设置 write----------写字板 winmsd---------系统信息 wiaacmgr-------扫描仪和照相机向导 winchat--------XP自带局域网聊天 me…

pytest框架_Python最火的第三方开源测试框架——pytest

一、介绍本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest。它有如下主要特性:assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了)自动发现测试模块和函数模块化夹具用以管理各类测试资源对 unittest 完全兼容&#xf…

jvm jstat_使用jstat的JVM统计信息

jvm jstat过去,我已经写过关于Oracle和/或OpenJDK Java开发工具包(JDK)附带的几个命令行工具的信息,但是我从来没有专门写过jstat工具 。 Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机(JVM)…

win10录屏工具_win10怎么录屏?这才是最长情陪伴你的录屏工具

win10怎么录屏?现在看视频的用户是越来越多了,一些经验类的视频教程越来越多,不仅能够教我们学习技能,也能给我们看一些会员才能看的视频内容,他们怎么怎么做的呢?当然是电脑录屏了,由于现在的电…

Macbook air 键盘失灵的解决方案

建议参考以下步骤: 确保您的 Mac 已经更新至最新版本。(重要:更新前建议您备份好 macOS 的数据。) 尝试重置 Mac 上的系统管理控制器 (SMC)。 尝试重置非易失的随机访问存储器(NVRAM)。 创建新的管理员帐户,使用新建…

python多行注释符号_涨知识Python 为什么用 # 号作注释符?

- START -关于编程语言中的注释,其重要性基本上已为大家所共识。然而关于注释的规范,这个话题就像我们之前聊过的缩进、终止符和命名方式一样,众口难调。注释符通常可分为两种,即行注释与块注释(inline/block),它们在不…

二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...

二叉树的遍历详解:前、中、后、层次遍历(Python实现)二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历、中序遍历、后续遍历、层次遍历——掌握这几种遍历方法是很有必要的。假设我们二叉树节点的定义如下——# Definition for a binary tree n…

java终结器_Java的终结器仍然存在

java终结器当我第一次学习Java并从C 过渡到Java时,我记得我经常被告知,经常读到它不应该像C 析构函数那样对待Java终结器,也不应该依靠它。 该建议的频率和坚持性对我产生了影响,以至于我无法回忆起我上一次编写finalize&#xff…