同じ外部実行可能ファイルを6回呼び出す必要があるJavaプログラムがあります。この実行ファイルは出力ファイルを生成し、6回の実行がすべて完了すると、これらのファイルをまとめてマージします。私はちょうど私がコードを実行したfor-loopを持っていました。そして、外部実行可能ファイルの最初の実行が終了するまで待機しました。 6回実行する...特に、互いに依存しないので、外部実行可能ファイルを一度に6回実行することでスピードアップするのはかなり簡単だと考えました。これを実現するためにExecutorService
とRunnable
などを使用しました。外部実行可能ファイルをわずかに速く呼び出すJava実行プログラム
私の現在の実装では、自分の時間を約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のファイルを書き込みます。
私はいくつかのテストを行いました。コードを6から1に変更し、それをタイムアウトしてから2になり、パフォーマンス上のメリットはごくわずかでした。だから私のコードは "正しい"と思うが、私のハードウェアは遅すぎる...私の疑惑を確認してくれてありがとう、CTRL-Zまでの時間;) – user869525