同じ外部実行可能ファイルを6回呼び出す必要があるJavaプログラムがあります。この実行可能ファイルは出力ファイルを生成し、6回の実行がすべて完了したら、これらのファイルを「マージ」します。コードを実行し、外部実行可能ファイルの最初の実行が終了するのを待ってから、もう一度呼び出すなど、forループがありました。
これは非常に時間がかかり、6回実行するのに平均52.4秒かかることがわかりました...特に相互に依存していないため、外部実行可能ファイルを一度に6回実行することで、かなり簡単に高速化できると思いました。 。これを実現するために、などを使用ExecutorService
しRunnable
ました。
現在の実装では、時間を約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のファイルが書き込まれます。