私はプログラミングの練習としてparellelクイックソートを実装しています。終了後、ExecutorsのJavaチュートリアルページを読みました。これにより、コードがさらに高速化されるようです。残念ながら、すべてがソートされるまでプログラムが続行されないようにするために、join()に依存していました。現在、私は以下を使用しています:
public static void quicksort(double[] a, int left, int right) {
if (right <= left) return;
int i = partition(a, left, right);
// threads is an AtomicInteger I'm using to make sure I don't
// spawn a billion threads.
if(threads.get() < 5){
// ThreadSort's run method just calls quicksort()
Future leftThread = e.submit(new ThreadSort(a, left, i-1));
Future rightThread = e.submit(new ThreadSort(a, i+1, right));
threads.getAndAdd(2);
try {
leftThread.get();
rightThread.get();
}
catch (InterruptedException ex) {}
catch (ExecutionException ex) {}
}
else{
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
}
これは問題なく機能しているようですが、非再帰的なquicksort()メソッドを呼び出した直後にe.shutdown()を実行すると、RejectedExecutionExceptionsが多数あるため、これは期待どおりに機能していないと思います。
とにかく、私は基本的にleftThread.join()と同じ機能を取得しようとしていますが、Executorを使用しています。私の質問は、
すべてのスレッドが完了するまで待つのに最適な方法ですか?
編集:わかりました。Executorをシャットダウンした後に大量のエラーが発生した理由を理解しました。これは、この関数をループで呼び出していて(実行時間を均等にするため)、新しいExecutorを作成していなかったためです。