使用executorservice来控制运行时进程

时间:2012-12-20 08:35:48

标签: java file-io executorservice

我使用Runnable对象来运行processCommand并进行一些花费一些时间的处理(让我们在processprocess中调用它)。在内部流程结束时,它会将某些内容写入文本文件。这个想法是,如果在某个指定的时间内,内部进程仍未完成,则必须将其终止,因此我使用ExecutorService来处理它。但是如果内部进程早于指定的时间结束,它将中断ExecutorService,因此主线程可以继续执行下一个任务。

但问题是,有时候,内部进程根本不会创建文件,或者它创建了一个文件但是没有任何内容写入。当内部进程早于指定时间结束时,就会发生这种情况。我不知道我的实施有什么问题。请注意,如果我手动执行该过程(不使用ExecutorService),则该过程运行良好并且正确地写入所有内容。

在这里,我发布了我的代码来完成工作:

public void process(){


    for (int i = 0; i < stoppingTime.length; i++) {
        for (int j = 2 * i; j < 2 * (i + 1); j++) {
            final int temp = j;
            ExecutorService executor = Executors.newSingleThreadExecutor();

            Runnable r = new Runnable() {

                @Override
                public void run() {
                    Process p = null;

                    int ex = 1;

                    try {
                        p = Runtime.getRuntime().exec(
                                processCommand.get(temp));

                        while (ex != 0) {
                            try {
                                //sleep every 30 second then check the exitValue
                                Thread.sleep(30000);
                            } catch (InterruptedException e) {

                            }
                            ex = p.exitValue();
                            p.destroy();                                
                        }                           
                    } catch (IOException e) {
                        e.printStackTrace();
                        System.out.println("IOException");
                    }
                }

            };

            Future future = executor.submit(r);

            try {
                System.out.println("Started..");
                future.get(stoppingTime[i], TimeUnit.SECONDS);                  
                System.out.println("Finished!");
            } catch (TimeoutException e) {
                System.out.println("Terminated!");
            } catch (InterruptedException e) {
                System.out.println("Future gets InterruptedException");
            } catch (ExecutionException e) {
                System.out.println("Future gets ExecutionException");
            }
            executor.shutdownNow();
            System.out.println("shutdown executor");
        }
        System.out.println();
    }

}

1 个答案:

答案 0 :(得分:0)

老问题,我想我还是试试。

首先,您在双循环内获得ExecutorService,与定义的Runnable位于同一个块中。如果您希望获得本机执行"processCommand"的返回值,然后继续执行下一个任务,那么您需要通过在循环之前实例化它来重用ExecutorService

其次,stoppingTime[i]intFuture.get(...)long