2009-11-24 13 views
5

私はプログラミングの練習として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:なぜ私はエグゼキュータをシャットダウンした後に何度もエラーが発生したことを知りました。これはループ内でこの関数を呼び出していたためです。

答えて

9

あなたはどのタイプのエグゼキュータを使用していますか?

ThreadPoolExecutor.awaitTermination()あなたが尋ねていることを行います(事実上バルク結合操作です)。

ThreadPoolExecutorを使用すると、スレッド数などの制限を設定することができます(スレッド数が高くなっている場合は、再帰的に行うよりも良いかもしれません)。

PS - エグゼクティブがあなたのコードをより速く実行させることは疑いがありますが、コードを読みやすく保守しやすくすることがあります。スレッドプールを使用すると、この種のアルゴリズムでは処理が速くなり、Executorはスレッドプールでの作業を容易にします。

+1

ThreadPoolExecutorsは、1000のスレッドがネットワークインターフェイスを輻輳させたくない場合、画像をダウンロードするのに最適です。 BTW私はAndroidがExecyncを使用して、背後でASyncTasksを管理していると確信しています。 – manmal

1

を使用することができますPS - 私は執行があなたのコードは、任意のより速く走らせるだろうことを疑うが、 彼らが読んで維持するためにあなたのコードを簡単にすることがあります。 Thread プールを使用すると、この種のアルゴリズムでは処理が高速になり、 Executorを使用すると、スレッドプールでの作業が容易になります。

これは正しくありません。

エグゼキュータは、プールされたスレッドを含む任意の数の異なる実行システムによって「バックアップ」することができます。

ファクトリクラスを正しく呼び出す必要があります。

あなたがないが最初に起因するスレッドの実行の制限にメモリ不足可能性があるため、さらにあなたも、仕事が速く、彼らが消費することができますよりも、キューに登録されているような状況に対処するための方針を決定する必要があり、何百万ものジョブをキューに入れたら、実行を待つ間に何らかの場所に格納する必要があります。

関連する問題