Java在操作系统中执行命令

时间:2009-10-14 14:05:13

标签: java

我有一个Java程序,可以在OS中执行特定的命令。我还使用Process.waitfor()在下面的代码中显示,指示执行是成功完成还是失败。

我的问题是,有没有其他方法可以避免使用process.waitfor(),有没有办法在进程完成之前使用while循环并执行某些操作?

            Runtime rt = Runtime.getRuntime();

        Process p = rt.exec(cmdFull);

        BufferedReader inStream = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String inStreamLine = null;
        String inStreamLinebyLine=null;
        while((inStreamLine = inStream.readLine()) == null) {
          inStreamLinebyLine = inStreamLinebyLine+"\n"+inStreamLine;
        }


        try {
            rc = p.waitFor();

        } catch (InterruptedException intexc) {
            System.out.println("Interrupted Exception on waitFor: " +
                               intexc.getMessage());
        }    

我想做什么,是这样的

            Runtime rt = Runtime.getRuntime();

        Process p = rt.exec(cmdFull);

        BufferedReader inStream = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String inStreamLine = null;
        String inStreamLinebyLine=null;
        while((inStreamLine = inStream.readLine()) == null) {
          inStreamLinebyLine = inStreamLinebyLine+"\n"+inStreamLine;
        }


        try {

            while ((rc = p.waitFor()) == true ) { // This is made up, I don't even think it would work
                System.out.println('Process is going on...');
            }


        } catch (InterruptedException intexc) {
            System.out.println("Interrupted Exception on waitFor: " +
                               intexc.getMessage());
        }    

谢谢,

3 个答案:

答案 0 :(得分:1)

您可以在开始此过程之前生成新线程。

新线程将负责打印出“正在进行的过程......”或任何需要的内容。

在p.waitFor()完成后,启动进程的主线程将向新线程指示它应该停止运行。

答案 1 :(得分:1)

你可以生成一个新的thread并在线程中进行等待,通过共享变量定期检查主线程是否等待线程已经完成。

答案 2 :(得分:1)

也许这样的事情会起作用。创建一个名为@tschaible建议的线程,然后在超时(这是你在代码中组成的部分)的那个线程上进行连接。它看起来像这样:

Thread t = new Thread(new Runnable() { 

  public void run() {
    // stuff your code here
  }

});
t.run();

while (t.isAlive()) {
  t.join(1000); // wait for one second
  System.out.println("still waiting");
}

这样做是将代码作为单独的线程启动,然后测试胎面是否每秒完成一次。 while循环应该在线程完成并且不再存在时结束。您可能必须检查InterruptedException但我现在无法测试。

希望这能让你朝着正确的方向前进。