java 进程运行时间_将Java类作为子进程运行

java 进程运行时间

我本周需要将Java类(而不是jar)作为子进程运行。 更确切地说,我想从测试内部产生一个新进程,而不是直接在测试内部(进程内)运行它。 我不认为这是幻想或复杂的事情。 但是,这不是我以前不需要做的事,也不知道要编写的确切代码。

幸运的是,稍后有一个快速的Google和一些Stack Overflow帖子。 我找到了所需的答案 。 尽管有答案,但为了我自己和你自己的利益,我在这里重写了它。

 class JavaProcess { private JavaProcess() { } public static int exec(Class clazz, List<String> jvmArgs, List<String> args) throws IOException, InterruptedException { String javaHome = System.getProperty( "java.home" ); String javaBin = javaHome + File.separator + "bin" + File.separator + "java" ; String classpath = System.getProperty( "java.class.path" ); String className = clazz.getName(); List<String> command = new ArrayList<>(); command.add(javaBin); command.addAll(jvmArgs); command.add( "-cp" ); command.add(classpath); command.add(className); command.addAll(args); ProcessBuilder builder = new ProcessBuilder(command); Process process = builder.inheritIO().start(); process.waitFor(); return process.exitValue(); }  } 

该静态函数将要执行的Class与所有JVM参数以及该类的main方法期望的参数一起接收。 可以访问两组参数可以完全控制子流程的执行。 例如,您可能希望使用低堆空间来执行您的类,以查看它在内存压力下如何应对(这是我需要的)。

注意,要使此方法起作用,您要执行的类需要具有一个main方法。 这很重要。

访问Java可执行文件的路径(存储在javaBin )允许您使用与主应用程序相同的Java版本执行子javaBin 。 如果将javaBin替换为"java" ,则存在使用计算机的默认Java版本执行子javaBin的风险。 很多时候那可能很好。 但是,在某些情况下可能不希望这样做。

将所有命令添加到command列表后,它们将传递到ProcessBuilderProcessBuilder获取此列表,并使用其中包含的每个值来生成命令。 command列表中的每个值都由ProcessBuilder用空格分隔。 它的构造函数还有其他重载,其中之一包含一个字符串,您可以在其中手动定义整个命令。 这消除了您手动管理在命令字符串中添加参数的需要。

子进程以其IO传递到执行它的进程开始。 查看生成的所有stdoutstderr都是必需的。 inheritIO是一种便捷方法,也可以通过调用链接以下代码来实现(也配置子inheritIOstdin ):

 builder .redirectInput(ProcessBuilder.Redirect.INHERIT) .redirectOutput(ProcessBuilder.Redirect.INHERIT) .redirectError(ProcessBuilder.Redirect.INHERIT); 

最后, waitFor告诉执行线程等待生成的子进程完成。 该过程是否成功结束或错误都无关紧要。 只要子流程以某种方式完成。 主要执行可以继续进行。 进程如何完成由其exitValue详细说明。 例如, 0通常表示成功执行,而1详细说明无效语法错误。 还有许多其他退出代码,它们在不同的应用程序中可能会有所不同。

调用exec方法如下所示:

 JavaProcess.exec(MyProcess. class , List.of( "-Xmx200m" ), List.of( "argument" )) 

它执行以下命令(或其附近的命令):

 /Library/Java/JavaVirtualMachines/jdk- 12.0 . 1 .jdk/Contents/Home/bin/java -cp /playing-around- -blogs MyProcess for -blogs MyProcess "argument" 

我剪掉了很多包括classpath在内的路径,以使其更加简洁。 您的外观可能会比这更长。 这实际上取决于您的应用程序。 上面命令中的路径是运行它所需的最低要求(显然是为我的机器定制的)。

exec方法相当灵活,有助于描述发生的情况。 虽然,如果您希望使其具有更大的延展性和适用性,但我建议从该方法返回ProcessBuilder本身。 允许您在多个地方重用这段代码,同时提供配置IO重定向的灵活性,以及​​决定是在后台还是在块中运行子流程并等待其完成的能力。 这看起来像:

 public static ProcessBuilder exec(Class clazz, List<String> jvmArgs, List<String> args) { String javaHome = System.getProperty( "java.home" ); String javaBin = javaHome + File.separator + "bin" + File.separator + "java" ; String classpath = System.getProperty( "java.class.path" ); String className = clazz.getName(); List<String> command = new ArrayList<>(); command.add(javaBin); command.addAll(jvmArgs); command.add( "-cp" ); command.add(classpath); command.add(className); command.addAll(args); return new ProcessBuilder(command);  } 

通过使用这两个功能中的一个(或两个),您现在可以运行应用程序的类路径中存在的任何类。 在我的情况下,这对于在集成测试中生成子流程非常有用,而无需预先构建任何jar。 这样就可以控制JVM参数,例如子进程的内存,如果直接在现有进程内部运行,则这些子进程将无法配置。

翻译自: https://www.javacodegeeks.com/2019/07/running-java-class-subprocess.html

java 进程运行时间

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

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

相关文章

划分vlan实验心得体会_思科:相同vlan,不同交换机之间的通信

实验拓扑如下&#xff1a;VPC 26 IP 23.1.1.3 24 VLAN20VPC 25 IP 12.1.1.2 24 VLAN10VPC1 IP 12.1.1.1 24 VLAN10VPC2 IP 23.1.1.2 24 VLAN20IOL交换机命名为SW1 先配置SW1的vlan10 和20检查SW1的vlan信息配置SW1的vlan10 和20检查SW2的vlan信息下一步将SW1和SW2连接的接口改为…

如何通过W3school学习JS/如何使用W3school的JS参考手册

文章目录学习JS对象DOM 对象HTML 对象JS 的常规类型教程学习 jQuery学习平台&#xff1a; W3school类似的学习平台&#xff1a; 菜鸟教程学习JS对象 DOM 对象 HTML 对象 JS 的常规类型 教程 学习 jQuery

快速选择

【0】README 0.1&#xff09;设有一组N 个数而要确定其中第k 个最小&#xff08;大&#xff09;者&#xff0c;我们称之为选择问题&#xff1b; 选择问题的解法&#xff1f;” 解法即为 快速选择算法&#xff1b; 0.2&#xff09; 快速选择是对 快速排序 改造而来&#xff0…

java模板方法模式_Java中的模板方法模式

java模板方法模式模板方法模式是一种行为模式&#xff0c;建议在超类中更一般地定义算法。 该算法是在称为模板方法的方法中定义的。 子类仅定义更具体的算法步骤的实现。 使用这种设计模式的好处是&#xff0c;算法后面的任何更改只会影响超类中的代码。 此外&#xff0c;它还…

hive 索爱_达内大数据云计算

第一阶段(Java基础)Java语言的高级特性静态导入、自动封箱拆箱、可变参数、增强for、枚举、类加载器、反射、内省、泛型、注解、动态代理回掌握Java语言的高级特性Java多线程多线程加强、线程池、Thread Local掌握Java线程池技术&#xff0c;掌握线程的Join、notify、notifyAll…

建立文件系统

【0】README 0.1&#xff09; source code and text description are from orange’s implemention of a os and for complete code, please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/orange_s_fs.tar&#xff1b; 0.2&#xff09; 此文件系统涉及到的…

判断字符串是否为空

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>检查指定的值是不是空字符串</title><script>function test_1() {// var name document.getElementById("name").value;// ale…

java策略设计模式_Java中的策略设计模式

java策略设计模式策略设计模式是一种行为模式&#xff0c;其中我们有多种算法/策略来完成一项任务&#xff0c;所使用的算法/策略留给客户选择。 各种算法选项封装在单独的类中。 在本教程中&#xff0c;我们将学习在Java中实现策略设计模式。 UML表示形式&#xff1a; 首先&…

随机森林算法 python_Python实现的随机森林算法与简单总结

本文实例讲述了Python实现的随机森林算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;随机森林是数据挖掘中非常常用的分类预测算法&#xff0c;以分类或回归的决策树为基分类器。算法的一些基本要点&#xff1a;*对大小为m的数据集进行样本量同样为m的有放回抽样&…

Hibernate的学习笔记

文章目录简介配置文件hibernate.cfg.xml映射配置文件主键生成方式主键生成方式的配置identitysequencenativeincrementassigned映射类型使用 Hibernate 实现 CRUD简介 Hibernate是对象关系映射&#xff08;ORM&#xff0c;Object RelationShip Mapping&#xff09;框架&#x…

在diy的文件系统上创建文件的流程

【0】README 0.1&#xff09; source code are from orange’s implemention of a os , and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/fs_create_file_p366 &#xff1b; 0.2&#xff09;本文总结的内容是干货&#xff0c;…

java设计模式 订阅模式_Java中的外观设计模式

java设计模式 订阅模式立面是指建筑物的外观。 当穿过街道时&#xff0c;我们所看到的只是建筑物的外观。 该工作面抽象了建筑物的所有复杂实现细节。 同样&#xff0c; 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 …

dnn模型 list index out of range_基于svm的财务预警模型

前言本文将我国A股上市公司作为研究对象&#xff0c;选取了A股 2015-2019 年度被 ST 或被 *ST上市公司&#xff0c;剔除了部分非财务原因导致ST或*ST的上市公司。财务指标选择了T-3期的资产负债率、流动比率、应收账款周转率等10个财务指标。数据收集及预处理导入所需要库 im…

汇编操作显存

【0】README 0.1&#xff09;本文转自&#xff1a; http://www.cnblogs.com/youxin/archive/2012/05/21/2512329.html for relative source code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/lib.inc 【1】关于 80*25彩色字符模式显示缓冲区&…

Hibernate中的实体对象的三种状态

对于 Hibernate 而言&#xff0c;实体对象的状态分为三种&#xff1a; 1.暂时态 当对象刚创建&#xff0c;和 Session 没有发生任何关系时&#xff0c;当程序运行完就立刻消失&#xff0c;被称为暂时态。 2.持久态 持久态的对象和 Session 发生了关系&#xff0c;如执行了 ses…

java设计模式之状态模式_Java中的状态设计模式

java设计模式之状态模式在本教程中&#xff0c;我们将探讨另一种流行的行为设计模式-状态设计模式。 当我们使用可以存在于多个状态的对象时&#xff0c;状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时&#xff0c;我们应该主要使用它。 这种模式有助于我们…

php概率计算_PHP指定概率算法

PHP指定概率算法&#xff0c;可用于刮刮卡&#xff0c;大转盘等抽奖算法。假设&#xff1a;有一个二维数组&#xff0c;记录了所有本次抽奖的奖项信息&#xff1a;$test_arr array(a>20,b>30,c>50);a奖概率20%&#xff0c;b奖概率30%&#xff0c;c奖概率50%模拟函数执…

os如何处理键盘的所有按键,显示or不显示,显示是如何显示

【0】README 0.1&#xff09; source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传&#xff1b; 【1】 键盘输入缓冲区 step1&#xff09;缓冲区的数据结构如下&#xff1a; step2&#xff09;对…

Hibernate的缓存机制/会话级缓存机制

Hibernate 中维持了两级缓存。第一级缓存由 Session 实例维护&#xff0c;该缓存区保存着与该 Session 实例有关联的所有实体对象的数据&#xff0c;也称为内部缓存。而第二级缓存则存在于 SessionFactory 实例中&#xff0c;由通过该 SessionFactory 实例获取的所有 Session 实…

orm提取指定列_使用ORM提取数据很容易! 是吗?

orm提取指定列介绍 几乎所有系统都以某种方式与外部数据存储一起运行。 在大多数情况下&#xff0c;它是一个关系数据库&#xff0c;并且通常将数据获取委托给某些ORM实现。 ORM涵盖了很多例程&#xff0c;并且带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有…