2023年11月29日发(作者:)
JavaProcess与Runtime()的使⽤及调⽤cmd命令阻塞的
解决⽅案
Java Process与Runtime()使⽤
java调⽤cmd执⾏bat⽂件有时会出现卡死的现象,当时感觉很迷惑,后来查资料,本来⼀般都是这样来调⽤程序并获取进程的
输出流的,但是我在windows上执⾏这样的调⽤的时候却总是在while那⾥被堵塞了,结果造成ffmpeg程序在执⾏了⼀会后不再
执⾏,这⾥从官⽅的参考⽂档中我们可以看到这是由于缓冲区的问题,由于java进程没有清空ffmpeg程序写到缓冲区的内容,
结果导致ffmpeg程序⼀直在等待。
在⽹上也查找了很多这样的问题,不过说的都是使⽤单独的线程来进⾏控制,我也尝试过很多⽹是所说的⽅法,可⼀直没起什
么作⽤。
⼀直认为是getInputStream的缓冲区没有被清空,不过问题确实是缓冲区的内容没有被清空,但不是getInputStream的,⽽是
getErrorStream的缓冲区,这样问题就得到解决了。
所以我们在遇到java调⽤外部程序⽽导致线程阻塞的时候,可以考虑使⽤两个线程来同时清空process获取的两个输⼊流,如下
这段程序:
public String excuteBatFile(String file, boolean isCloseWindow)
{
String cmdCommand = null;
String res = null;
if(isCloseWindow)
{
cmdCommand = " /c " + file;
}else
{
cmdCommand = " /k " + file;
}
StringBuilder stringBuilder = new StringBuilder();
Process process = null;
try {
process = time().exec(cmdCommand);
final InputStream is1 = utStream();
new Thread(new Runnable() {
public void run() {
BufferedReader bufferedReader = null;
String line = null;
try {
bufferedReader = new BufferedReader(
new InputStreamReader(is1, "GBK"));
while((line=ne()) != null)
{
(line+"n");
}
();
} catch (Exception e) {
// TODO Auto-generated catch block
tackTrace();
}
java Process执⾏cmd命令流阻塞处理
代码如下:
public static void runCmd() {
Process process = null;
BufferedReader bufferedReader = null;
try {
ger().info("============= 开始重启机器 =============");
process = time().exec(" /c shutdown -r -f -t 0");
bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(utStream()), e("GB2312")));
// 开启线程读取错误输出,避免阻塞
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。


发布评论