Java执行器只能稍微调用外部可执行文件

时间:2012-05-09 14:08:42

标签: java concurrency runnable executorservice

我有一个Java程序需要调用相同的外部可执行文件6次。此可执行文件生成一个输出文件,一旦完成所有6次运行,我将这些文件“合并”在一起。我只是有一个for循环,我运行代码,等待外部可执行文件的第一次运行结束,然后我再次调用它等。

我发现这非常耗时,平均52.4秒运行6次...我认为通过一次运行外部可执行文件6次来加速会非常容易,特别是因为它们不依赖在彼此身上。我使用ExecutorServiceRunnable等来实现这一目标。

根据我目前的实施情况,我节省了大约5秒的时间,使其速度提高了约11%。

以下是一些解释我正在做的事情的简化代码:

private final List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();

....

private void setUpThreadsAndRun() {
    ExecutorService executor = Executors.newFixedThreadPool(6);

    for (int i = 0; i < 6; i++) {
        //create the params object
       tasks.add(Executors.callable(new RunThread(params)));
    }

    try {
        executor.invokeAll(tasks);
    } catch (InterruptedException ex) {
        //uh-oh
    }

    executor.shutdown();
    System.out.println("Finished all threads!");
}

private class RunThread implements Runnable {
    public RunThread(ModelParams params) {
        this.params = params;
    }

    @Override
    public void run()
    {
         //NOTE: cmdarray is constructed from the params object
        ProcessBuilder pb = new ProcessBuilder(cmdarray);
         pb.directory(new File(location));
         p = pb.start();
    }
}

我希望有一种更有效的方法来做到这一点......或者我可能通过尝试一次运行此过程6次来“堵塞”我的计算机资源。此过程确实涉及文件I / O并写入大小约为30mb的文件。

1 个答案:

答案 0 :(得分:2)

唯一一次分支可执行文件6次将获得性能提升,如果你有至少6个CPU内核并且你的应用程序受CPU限制 - 即主要是处理器操作。由于每个应用程序都写入一个30mb的文件,听起来它正在执行大量的IO而应用程序是IO绑定的 - 受到硬件为IO请求提供服务的能力的限制。

要加快程序速度,您可以尝试2个并发进程,看看是否有所改进。但是,如果你的程序是IO绑定的,那么你将永远不会通过分支多个副本来提高速度。