我有一个 Java 程序需要调用相同的外部可执行文件 6 次。这个可执行文件生成一个输出文件,一旦所有 6 次运行完成,我将这些文件“合并”在一起。我确实有一个 for 循环,我在其中运行代码,等待外部可执行文件的第一次运行结束,然后我再次调用它,等等。
我发现这非常耗时,平均需要 52.4 秒才能运行 6 次……我认为通过一次运行外部可执行文件 6 次来加速非常容易,尤其是因为它们不相互依赖. 我使用ExecutorService
andRunnable
等来实现这一点。
使用我当前的实现,我节省了大约 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 的文件。