Runtime.exec().waitFor() 实际上并未等待

2024-03-13

我有一些使用 Runtime.exec() 运行外部 .jar (作为 IzPack 安装程序构建)的代码。

如果我从命令行运行这个 external.jar,如下所示:

java -jar external.jar

然后,在应用程序完成之前,命令提示符不会返回控制权。但是,如果我从某个 java 类中运行 external.jar,请使用:

Process p = Runtime.getRuntime().exec("java -jar external.jar");
int exitCode = p.waitFor();
System.out.println("Process p returned: " + exitCode);

Then p几乎立即返回,成功代码为0,尽管 external.jar 尚未完成执行(我也通过ProcessBuilder外部文件执行的路径)。

为什么它等待从命令行返回,但在另一个 java 程序中执行时则不等待?

我还设置了 3 个 jar,A、B 和 C,其中 A 调用 B,B 调用 C(使用Runtime.exec()),其中 CThread.sleeps 10 秒,作为一个简单的测试,正如预期的那样,A 运行后 10 秒才返回。

我认为这可能是 external.jar 的某种线程问题,其中执行从一件事移交给另一件事,但考虑到它直接从命令行工作,我希望看到相同的行为(也许天真地)当从另一个 java 程序中调用时。

我已经在 Windows 和 Ubuntu 上使用 Java 6 进行了测试。

Thanks!


实现此目的的另一种可能方法是捕获该过程的输出并等待其完成。

例如:

Process tr = Runtime.getRuntime().exec( new String[]{"wkhtmltopdf",mainPage,mainPagePDF});
BufferedReader stdOut=new BufferedReader(new InputStreamReader(tr.getInputStream()));
String s;
while((s=stdOut.readLine())!=null){
       //nothing or print
}

通常输出流是 tr.getInputStream() 但根据您正在执行的程序,进程输出流可能是:

  • tr.getInputStream()
  • tr.getErrorStream()
  • tr.getOutputStream()

通过执行此 while 循环,您可以强制程序等待该过程完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Runtime.exec().waitFor() 实际上并未等待 的相关文章

随机推荐

  • 如何比较两个边缘图像(在 OpenCV 中)?

    在我的项目中 我需要与图像进行比较 一张图像显示渲染模型 另一张图像是照片 其中显示模型中表示的真实对象 我到底想要什么 该算法必须比较两个图像并返回一个描述相似度的数字 假设数字越低 图像就越吻合 两个图像都表示为二进制图像 仅包含真实渲
  • iOS PNG图像旋转90度

    在我正在编写的 iOS 应用程序中 我处理 PNG 因为我处理 Alpha 通道 由于某种原因 我可以将 PNG 加载到我的imageView很好 但是当需要将图像从我的应用程序复制到粘贴板上或将图像保存到我的相机胶卷时 图像会旋转 90
  • 如何在 swagger 中成功记录多种内容类型的 GET 响应

    假设我们有一个 json swagger 规范示例 swagger 2 0 info version 1 0 0 title Some API basePath api v1 consumes application json produc
  • 如何在 Swift 中使用 dropbox api 获取共享链接?

    我想制作一个应用程序 让用户将文件上传到保管箱 然后获得共享该文件的选项 如何获取文件的保管箱链接 看来我可以用 client sharing createSharedLink 路径 myfile 但我如何以字符串形式访问该数据 这是一个如
  • Windows:自动挂起整个进程? [复制]

    这个问题在这里已经有答案了 使用 Win32 API 只能使用以下命令挂起单个线程SuspendThread 但不是一次调用就能完成完整的过程 迭代进程线程并一次挂起它们并不是一个好的选择 因为它可能会导致死锁和意外行为 这应该是使用 DD
  • thread_local 的成本

    现在C 正在添加thread local存储作为一种语言功能 我想知道一些事情 What is the cost of thead local likely to be 在记忆中 用于读和写操作 与之相关的是 操作系统通常如何实现这一点 看
  • 修复页面滚动时的标题转换

    我一生都无法弄清楚这一点 有谁知道这个网站上的滚动效果是如何创建的 http blindbarber com news http blindbarber com news 我正在开发一个项目 该效果将非常有帮助 这样我的固定导航在滚动时不会
  • 将日期从字符串格式转换为 OLE 自动化日期

    我有一个日期字符串21 Apr 2018 如何将此日期字符串转换为 python 中的 OLE 自动化日期 我正在使用Python v3 6 OLE 日期的定义可以在此处找到 https msdn microsoft com en us l
  • JpaRepository 与枚举:findAllByOfferState_ACTIVE。没有这样的元素异常

    我想获得所有报价 其中 OfferState 等于 ACTIVE 是否可以仅使用方法名称使用 Spring Data 或者我必须使用 Query Repository public interface OfferRepository ext
  • MySQL - 如何规范化包含分隔符分隔 ID 的列

    我正在尝试规范化一个表 该表是以前的开发人员设计的 其中有一列包含管道分隔的 ID 这些 ID 链接到同一个表中的其他行 客户表 id aliases VARCHAR 1 4 58 76 2 3 4 1 58 76 58 1 4 76 76
  • 在集合中的项目数非常大的 WHERE 子句中使用“IN”

    我遇到一种情况 我需要对一组非常大的行进行更新 我只能通过它们的 ID 来识别这些行 因为目标记录是由用户选择的 除了用户的记录集之外没有任何共同点 想修改 所有这些记录上的相同属性都在更新 因此我想进行一次 UPDATE 调用 这是不好的
  • HOG 人体检测器:背景减除图像的误报检测

    我正在开展一个需要检测场景中的人员的项目 最初在原始帧上运行 HOG 检测器后 所有帧上的特定背景对象都被检测为人 从而产生 3021 个误报检测 因此 我采取了合理的步骤 通过对所有帧应用背景减法器 BackgroundSubtracto
  • Rascal:创建 AST 时 boolcollectBindings 的作用是什么?

    我有一个关于在 rascal 中创建 AST 的问题 我通常会执行以下操作 model createM3FromEclipseProject project testproject decls createAstsFromEclipsePr
  • PHP preg_match 长度限制 3276

    看来 PHP 的preg match在某些情况下 匹配重复字符的字符数限制为 3276 i e s 0 3276 有效 但是 s 0 3277 才不是 它似乎并不总是适用 因为 0 3277 works 我在 PHP 文档或错误跟踪器中找不
  • 在距离 10 的圆内画一个圆

    我最近开始使用 Android 我需要在圆内画一个圆 就像下面的图片一样 距离 10 如果你看到下面的照片 我需要画一个像下面这样的具有两个直径的圆 但我不这样做不需要照片上当前存在的任何图标 只是具有两个直径的圆中的圆 我只想绘制圆圈和两
  • 如何更改Android中全息主题的菜单项文本颜色?

    我在我的应用程序中使用 Theme Holo 我使用以下 Style xml 自定义了我的主题
  • mysqli 或 PDO - 优缺点是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 sudo 执行 bash 函数?

    我尝试导出该函数 然后使用 bash 执行它 但这不起作用 export f my func sudo bash c my func bash my func command not found 如果我尝试在不使用 sudo 的情况下使用
  • 组合 2 个列表的元素

    假设我们有两个列表 val l1 List a b c val l2 List 1 2 3 我想要的是 List a1 b2 c3 即 将 l1 的第 n 个元素与 l2 的第 n 个元素相加 实现它的一种方法是 l1 zip l2 map
  • Runtime.exec().waitFor() 实际上并未等待

    我有一些使用 Runtime exec 运行外部 jar 作为 IzPack 安装程序构建 的代码 如果我从命令行运行这个 external jar 如下所示 java jar external jar 然后 在应用程序完成之前 命令提示符