私はプログラミングの練習としてparellelクイックソートを実装しています。終了したら、ExecutorsのJavaチュートリアルページを読みます。これは自分のコードをさらに高速化できるように思えます。残念ながら、私はjoin()のプログラムがすべてがソートされるまで続かないことを確認することに頼っていました。今私が使用している:私はe.shutdown(実行する場合Executorのすべてのスレッドが終了するのを待ちますか?
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);
}
}
をこれは私が私の非再帰的クイックソート()メソッドを呼び出した直後に、それはそう、RejectedExecutionExceptionsの束を持っている)[OK]を動作するようですが、私はこれが私の望んでいたほどうまくいかないと思います。とにかく
、私は基本的にleftThread.join(と同じ機能を取得しようとしている)が、エグゼキュータで、そして私の質問があるんだ:
が、これはすべてのスレッドまで待つための最良の方法ですされていますか?
EDIT:なぜ私はエグゼキュータをシャットダウンした後に何度もエラーが発生したことを知りました。これはループ内でこの関数を呼び出していたためです。
ThreadPoolExecutorsは、1000のスレッドがネットワークインターフェイスを輻輳させたくない場合、画像をダウンロードするのに最適です。 BTW私はAndroidがExecyncを使用して、背後でASyncTasksを管理していると確信しています。 – manmal