2

这个类是执行命令的响应,打印结果

    public class ExecutorTask implements Runnable{

    @Override
    public void run() {

        Process process = null;
        try {
            process = Runtime.getRuntime().exec("cmd /c dir");
             BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
             String line="";
             while ((line = reader.readLine()) != null) {
                 System.out.println(line);
             }
            process.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            return;
        }
    }
}

第二个类是执行器,使用线程运行 shell

public final class ShellCommandExecutor{

    public void execute(String command){

        ExecutorTask task = new ExecutorTask();
        Thread executorThread = new Thread(task);
        executorThread.start();

        /*try {
            Thread.sleep(1000);
            executorThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
    }

}

问题是为什么我必须在 ShellCommandExecutor 类中添加代码片段:

try {
        Thread.sleep(1000);
        executorThread.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

然后我可以看到打印结果:

2012-08-21  00:32    <DIR>          .
2012-08-21  00:32    <DIR>          ..
2012-08-21  00:32             1,576 .classpath
2012-08-21  00:26             1,224 .project
2012-08-07  10:58    <DIR>          .settings
2012-08-24  15:19            10,965 pom.xml
2012-08-07  10:57    <DIR>          src
2012-08-21  00:32    <DIR>          target
2012-08-24  10:22                 0 velocity.log

为什么?

4

2 回答 2

2

你开始了一个线程

 executorThread.start();

如果您什么都不做,启动它的线程(您的主线程)将不会等待您的 executorThread 在返回之前完成,因此您的应用程序将在该线程执行其任务之前退出。

要等待您的 executorThread 完成,您应该调用:

executorThread.join();

稍后在代码中。此时,您将确保它已完成任务。

目前它可以工作,因为您在主线程中等待 1 秒,在此期间您的其他线程执行其操作。但是,如果您的 executorThread 需要超过一秒钟的时间来执行它,它将无法工作,所以sleep()在这种情况下您不应该这样做。

请参阅Thread.join javadoc。

于 2012-08-25T11:13:37.337 回答
0

首先,为什么在不使用 String 时将其用作 execute()方法中的参数...

我尝试了您的程序稍作修改,它没有 sleep()interrupt()

试试下面的代码......

public final class ShellCommandExecutor{

    public void execute(){

        ExecutorTask task = new ExecutorTask();
        Thread executorThread = new Thread(task);
        executorThread.start();

        /*try {
            Thread.sleep(1000);
            executorThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
    }

    public static void main(String[] args){


        new ShellCommandExecutor().execute();
    }

}



class ExecutorTask implements Runnable{

    @Override
    public void run() {

        Process process = null;
        try {
            process = Runtime.getRuntime().exec("cmd /c dir");
             BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
             String line="";
             while ((line = reader.readLine()) != null) {
                 System.out.println(line);
             }
            process.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            return;
        }
    }
}
于 2012-08-25T11:14:09.173 回答