Process.waitFor()

ProcesswaitFor死锁问题及解决办法 ProcesswaitFor死锁问题及解决办法 一、问题概述 最近在项目开发中,遇到一个问题, java主线程使用Runtime.exec调用子线程执行shell脚本命令,子线程一直阻塞,而主线程调用process.waitfor()等待子线程返回执行结果,主线程迟迟等不到子线程的返回结果,程序一直阻塞。 示例代码如下: import lombok.extern.slf4j.Slf4j; import java.io.BufferedReader; import java.io.InputStream; 阅读详情

在Java程序中,经常会遇到需要执行外部命令的情况,此时可以使用Runtime.getRuntime().exec(commands)。

场景:java程序中需要执行shell命令

代码:

  Process process = Runtime.getRuntime().exec(commands);

  // 重定向错误输出
            StreamRedirect errorStream = new StreamRedirect(process.getErrorStream(), "ERROR");
            errorStream.start();
            // 重定向标准输出
            StreamRedirect outStream = new StreamRedirect(process.getInputStream(), "STDOUT");
            outStream.start();


疑问:要不要process.waitFor();

通过Process可以对获取脚本执行的输出,然后在Java中进行相应处理。process.waitFor();会导致当前线程等待子进程执行结束,在我们的应用场景中,不需要等待子进程执行结束。但是不调用process.waitFor()会导致子进程立刻结束退出吗?待测试。

Java process.waitFor()出现死锁问题及解决方法 在项目中需要使用ffmpeg对流服务器录制的视频文件进行转码操作,由于需要等待视频转码完成故调用Process.waitfor()等待,在开发时使用OBS和一台相机对流服务器进行推流,一直没出现问题。今天测试拿了台新相机在测试环境测试,发现录制视频大概超过半小时视频就会保存失败。通过查日志定位,最终确定问题出在Process执行ffmpeg步骤,查看发现ffmpeg进程被阻塞了,但直接执行该ffmpeg命令又是正常完成。于是怀疑java进程和ffmpeg进程出现了死锁。 阅读详情

相关推荐

Android影像系统架构专家面试指南

传音控股招聘影像系统架构专家,要求8年以上开发经验,5年架构设计经验,精通Android Camera开发及性能优化。该职位需负责手机影像软件架构设计、技术选型及跨平台适配,重点解决"快稳省"体验优化。面试评估聚焦三大维度:技术方面考察HAL层架构设计、多帧合成优化等能力;系统开发关注低光降噪等场景的算力平衡;团队管理侧重跨部门协作与项目交付。候选人需展现对CamX-CHI等架构的深入理解,具备量化分析性能指标的能力,并能主导旗舰机影像项目全周期落地。

郑伟强dev的专栏 909

Process的使用

目前需要做一个功能,就是通过java进行mysqldump备份,但是mysql时运行在容器中的时候,已知Java目前只有一个Runtime.getRuntime()一种方式能获得当前linux运行时环境的方式所以接下来就是通过这个方式实现这个功能。

赵成默 2647

华为OD机试双机位A卷 - 小明减肥 (C++ & Python & JAVA & JS & GO)

华为OD机试2025双机位A卷 小明减肥,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 676

process.waitfor()超时配置

在编写Java程序时,有时候我们需要调用外部的exe,这时可以通过Runtime的exec()方法,该命令使用比较简单,但是无法对执行做细节的控制。通过使用ProcessBuilder构建Process可以进行细节的控制,但是默认process是阻塞的。不要被误解,他也是阻塞的,阻塞到process进程执行完,才进行是否超时的判断。并不是说当超时时他会自动结束。通过process.destroy()方法可以从外部终止该process。但是waitFor时主进程阻塞是阻塞的。

fighting_DW 3537

Java使用Process执行命令时,waitFor()方法死锁阻塞

一:在使用JavaProcess类时,调用waitFor方法可能会导致线程阻塞无法返回,例如,解压压缩包时,压缩包有密码,而命令中没有设置密码。三:这种时候需要添加一个工具类或者配置类,不断的读取消耗缓冲区的数据,以至子进程不会挂起,并且设置超时。ProcessConfig配置类,start方法通过线程池创建线程。原来添加代码异常处理。

xizhen2791的博客 3211

Process的的waitFor()造成的阻塞

我们在调用ProcesswaitFor()时经常会遇到明明Process已经结束了,但是waitFor()还是阻塞在那里,那是因为Process的inputStream缓存造成的,我们现在另外再起一个线程,来监控我们的Process,实时清空缓存就可以解决这个问题了class WatchThread extends Thread { Process p; boolean over; ArrayList stream; public

Thinking with Android 1万+

java process.waitfor_java ProcesswaitFor()

在编写Java程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本。在Java中提供了两种方法来启动其他程序:(1) 使用Runtime的exec()方法(2) 使用ProcessBuilder的start()方法Runtime和ProcessBulider提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。但是这两种方法都会返回一个用于管理操作系统进程的Process...

weixin_32541907的博客 1671

ProcesswaitFor() 造成的阻塞

我们在调用ProcesswaitFor()时经常会遇到明明Process已经结束了,但是waitFor()还是阻塞在那里,那是因为Process的inputStream缓存造成的,我们现在另外再起一个线程,来监控我们的Process,实时清空缓存就可以解决这个问题了。 class WatchThread extends Thread { Process

sh_c1991的专栏 2130

process.waitFor()的问题

1. Process process = Runtime.getRuntime().exec("cmd /c start tester.exe"); process.waitFor(); 这个代码中的process.waitFor();并没有起到作用 后面的代码在调用的tester.exe还没结束就继续运行了, 结果发现是因为在exec里面用了start 这样的后果是p

scoliver的专栏 2248

Java ProcesswaitFor()的问题

转自http://yearsaaaa123789.iteye.com/blog/1404865   在编写Java程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本。在Java中提供了两种方法来启动其他程序:(1) 使用Runtime的exec()方法(2) 使用ProcessBuilder的start()方法 。Runtime和ProcessBulider提供了不同的方

jimzhai的专栏 4万+

JavaProcesswaitFor()阻塞问题

在做视频转换时,调用外部的 exe 去进行一些视频转换的操作时,因为考虑到速度问题,当时是通过启动多个线程来共同完成某个操作的,因为是多线程操作,所以当时我控制的主线程等待所有子线程执行完后再继续向下去执行。但是始终出现发现没有控制住子线程未执行完主线程就向下继续执行的情况,开始因为是启动多线程时线程控制问题,后来发现是子线程中利用 Process 调用外部 exe ...

王旭东 2639

java exec waitfor,Java Process waitFor()方法与示例

流程类waitFor()方法在java.lang包中提供了waitFor()方法。waitFor()方法用于使当前正在运行的线程在需要时等待,直到由该Process对象表示的进程完成其终止为止。当进程已经终止并且进程尚未终止时,waitFor()方法将返回,直到进程终止,调用线程才会被阻塞。waitFor()方法是一种非静态方法,只能通过类对象访问,如果尝试使用类名称访问该方法,则会收到错误消息。...

weixin_33212915的博客 1389

Java-进程-Process类-waitFor方法

Java-进程-Process类-waitFor方法

深度安全实验室 864

Process#waitFor()阻塞问题

     有时需要在程序中调用可执行程序或脚本命令: Process process = Runtime.getRuntime().exec(shPath); int exitCode = process .waitFor();   Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与...

ZERO 5483

Java Process.waitFor() 阻塞卡住不返回

1. 现象 在Java程序中,启动另一个进程执行一个命令时可以使用ProcessBuilder类启动一个进程。 以运行ps命令为例: ProcessBuilder processBuilder = new ProcessBuilder("ps"); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); processBuilder.start()会立刻返回,不会待ps进程结束。所...

REX1024的博客 6372

ProcesswaitFor死锁问题以及解决方案

ProcesswaitFor死锁问题以及解决方案

qq_21875331的博客 4817

java process.waitfor();,正确的调用系统命令——为Process.waitFor设置超时以及其他 | 学步园...

Java中在阻塞调用系统命令的时候,一般是使用Runtime.getRuntime().exec(command)返回一个process对象,再调用Process.waitFor()来等待命令执行结束,获取执行结果。然而这样简单的调用也是有坑的,有几个地方需要小心留意。一个是Runtime.getRuntime().exec(command)这个调用对于可执行文件路径或者参数中有空格等特殊字符的情...

weixin_33218490的博客 2754

process.waitFor()

1.process.waitFor() 暂停等待被调用的process的执行,process执行结束之后,以下代码继续执行

www.hohode.com 976

实证分析-地级市数字经济指数测算数据(含原始+do代码)2011-2024年.txt

因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/m0_65541699/article/details/160395731

上一篇: @Override annotation 错误
下一篇: ffmpeg Documentation-1 简介
唐辰砂
博客等级 码龄15年 1粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值