Process.waitFor()、Runtime.getRuntime().exec方法的问题,代码如下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Process.waitFor()、Runtime.getRuntime().exec方法的问题,代码如下相关的知识,希望对你有一定的参考价值。

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadMAC
public static String physicalAddress = "read MAC error!";
public ReadMAC()
public static String checkPhysicalAddress()
try
String line;
Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all");
System.out.println("befor process.waitFor();");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// process.waitFor(); //这句话加在这里执行ipconfig /all命令程序就停在这里了
System.out.println("after process.waitFor();");
while ( (line=bufferedReader.readLine()) != null)
if(line.indexOf("Physical Address. . . . . . . . . :") != -1)
if(line.indexOf(":") != -1)
physicalAddress = line.substring(line.indexOf(":")+2);
break; //找到MAC,推出循环



process.waitFor(); //这句话加在这里执行ipconfig /all命令程序就停正常了

catch(IOException ioe)

ioe.printStackTrace();
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();

return physicalAddress;

public static void main(String[] args)

System.out.println("本机的MAC地址是: "+ ReadMAC.checkPhysicalAddress());



如上面代码中注释中提到的,process.waitFor(); 加在不同的地方结果是不一样的。但是为什么呢?请高手赐教。谢谢。
在这里再问达人一个问题,就是Runtime.getRuntime().exec方法中的参数到底是怎样的?规则等。最好还请高手们能举例说明!如果我想执行这样的操作应该怎么用?首先我想用CD命令把路径转到D:\Program Files\mysql\MySQL Server 5.0\bin,然后在D:\Program Files\MySQL\MySQL Server 5.0\bin中执行mysql的相关命令(如:mysql -uroot -p*****)应该怎么样?谢谢赐教!谢谢!再次谢谢个位达人了!谢谢!

参考技术A 1 为何要用waitFor,这是让当前线程等待你的进程结束,你掉的命令应该会自动结束,不需要waitFor,如果硬要停止,可用destroy

2 Runtime.getRuntime().exec("mysql -uroot -p****",
null, new File("D:\\Program Files\\MySQL\\MySQL Server 5.0\\bin")) ;

Process的Waitfor() 引起代码死锁

Java用process调用c#的exe后,process.waitfor(). exe执行会停在某处。据说是waitfor引起的exe子线程死锁。

先存一个链接 http://yearsaaaa123789.iteye.com/blog/1404865

关键引用

因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入何从标准输入快速的读入都有可能造成子进程的所,甚至死锁。好了,问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。接着来分析缓冲区,哪来的这个东西,当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waitfor()这里。 

 

以上是关于Process.waitFor()、Runtime.getRuntime().exec方法的问题,代码如下的主要内容,如果未能解决你的问题,请参考以下文章

Process.waitFor()、线程和 InputStreams

Process的Waitfor() 引起代码死锁

怎样判断子进程已经结束 process.waitFor;的问题

Process.waitFor()方法的返回值

Process.waitFor()方法的返回值

Process.waitFor()方法的返回值