各位好,请看代码package com.scott.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/**
 * 
 * @author xjqin 2010-3-12
 * @describe 这个是一个封装了的一个运行环境
 */
public class RunTimeInfo {
private BufferedReader input = null;
private BufferedReader error = null;
private String command = "";
private StringBuffer inputInfo = new StringBuffer();
private StringBuffer ErrorInfo =  new StringBuffer();;
private Process Process = null;
private int exitValue = 0 ;


public RunTimeInfo(String Command) {
   try {
   this.command = Command;
init();
} catch (IOException e) {
e.printStackTrace();
}
}

private void init() throws IOException
{
this.Process = Runtime.getRuntime().exec(this.command);

this.input = new BufferedReader(new InputStreamReader(this.Process.getInputStream()));
this.error = new BufferedReader(new InputStreamReader(this.Process.getErrorStream())); String line = "";
while ((line = this.input.readLine()) != null) {
inputInfo.append(line).append("\n");
}
input.close();


while ((line = error.readLine()) != null) {
ErrorInfo.append(line).append("\n");
}
error.close();

try {
this.Process.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.Process.destroy();
                  System.out.println("------");
this.exitValue = this.Process.exitValue();
} public final String getCommand() {
return command;
} public final void setCommand(String command) {
this.command = command;
} public final BufferedReader getError() {
return error;
} public final void setError(BufferedReader error) {
this.error = error;
} public final StringBuffer getErrorInfo() {
return ErrorInfo;
} public final void setErrorInfo(StringBuffer errorInfo) {
ErrorInfo = errorInfo;
} public final int getExitValue() {
return exitValue;
} public final void setExitValue(int exitValue) {
this.exitValue = exitValue;
} public final String getInput() {
return input.toString();
} public final void setInput(BufferedReader input) {
this.input = input;
} public final String getInputInfo() {
return inputInfo.toString();
} public final void setInputInfo(StringBuffer inputInfo) {
this.inputInfo = inputInfo;
} public final Process getProcess() {
return Process;
} public final void setProcess(Process process) {
Process = process;
}}/**
 * 
 */
package com.scott.test;
/**
 * @author 53 2010-3-12
 * @describe 测试运行类
 */
public class RuntimeTest { public static void main(String args[]) {
String command = "cmd.exe /c rmdir /s/q D:\\PAMS_DOC\\OutPut";
RunTimeInfo info = new RunTimeInfo(command);
int exitValue = info.getExitValue();
String errorInfo = info.getErrorInfo().toString();
System.out.println("退出值" + exitValue);
System.out.println("错误信息" + errorInfo);
}}由于该段程序时在web系统上面的一个按钮触发执行的
意为:删除windows系统上的某个文件夹
但是遇到这样的问题:
1.在我第一次触发事件的时候,删除失败,原因是文件打开状态中
2.以后的触发事件,提示的语言都是文件被其他进程所使用,所以我在第一段程序process.destroy()之后添加了System.out.println("------");但是发现程序没有打印出------,估计是没有执行到这里.
是不是因为某种原因让该进程没有销毁掉?
是不是因为前面清除文件的命令是阻塞的,导致不成功后后边的程序无法进行?
但是感觉也不对啊,命令运行后错误信息都已经显示出来了,还是阻塞的吗?注意了:是在web上面遇到的这个问题望高手解答,谢谢!

解决方案 »

  1.   

    package Thread;public class TwoThread {
    public static void main(String[] args) {
    Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get
    Producer p=new Producer (q);//让new出的p去往q里面put
    Customer c=new Customer (q);//让new出的c从q中get
    p.start();//p和q开始的顺序并不报错
    c.start();

    }
    }
    class Producer extends Thread
    {
    Queue q;
    public Producer(Queue q) {
    this.q=q;//给成员变量赋值,再一调运q的put方法
    }
    @Override
    public void run() {
    for (int i = 0; i < 10; i++) {
    q.put(i);//此处只是让q去put  10次
    System.out.println("Producer put "+i);//并且输出本次放的是第几杯
    }
    }
    }
    class Customer extends Thread
    {
    Queue q;
    public Customer(Queue q) {
    this.q=q;//给成员变量赋值,再一调运q的get方法
    }
    @Override
    public void run() {
    while (true) {//死循环:只要q里面有,就去get
    //get方法有返回值,返回值就是producer所put的数量
    //此处也不需要去考虑是第几杯
    //在Queue中的value解决可这一问题:
    //put中的I赋给value,get方法有返回值就value的值
    System.out.println("Customer get "+q.get());
    //如果循环完了,就跳出循环,否则线程不会自己结束
    if (q.value==9) {
    break;
    }
    }

    }
    }
    class Queue
    {
    int value;
    boolean bFull=false;
    public synchronized void put (int i)//在producer中的put方法中就是将其I传进来
    {
    if (!bFull) {//条件为真(如果没满,就倒水)
    value=i;//给value赋值,现在有几杯水
    bFull=true;//满了
    notify();//唤醒其他线程(让customer去get)
    }
    try {
    wait();//告诉customer去get后自己等待customer的get结束
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public synchronized int get()
    {
    if (!bFull) {//如果没满就等待,如果满了就不进    **这就是为什么main里面谁先开始不报错的原因**
    //get和put方法中的if条件判断起到了至关重要的作用
    try {
    wait();
    } catch (InterruptedException e) {

    e.printStackTrace();
    }
    }
    bFull =false;//赋值为没满
    notify();//唤醒producer去put
    return value;//get的返回值就是put的时候给value赋的值
    }
    }
      

  2.   

    恩,有段时间没有接触Java了,这个问题以前遇到过的。好像API里面就有解决方法的,LZ找找看吧。
      

  3.   

    line = this.input.readLine()你的程序死在上面这句话上了,设个timer停掉就是了
      

  4.   

    readLine()这个方法会让程序阻塞掉吗?
    读不到数据的话直接就返回为空了.怎么会死在这里的呢?
      

  5.   

    我debug你的程序,是死在readline上了你可以试试看
      

  6.   

    read tasklist 
    destory taskkill
    Google下 就知道了
      

  7.   

    在正常输出流和error输出 流你都应该用两个线程去处理,如果在上面没读到东西就死在那里了。
      

  8.   

    如果是守护线程的话,调用destroy()方法,就可以让这个进程也销毁啊!