わかりました、例を挙げて私が求めていることを説明します。
与えられたときに並列マージアルゴリズムを実装しようとしているとしましょう:
dbは、 db[i]がオブジェクトの ArrayList である配列です。
jはそのサイズです。 Merger(db,cmp,i,j)は、 db[j] を db[i] にマージする runnable です。
cmp は関連する Comparator です。
これは私が最初に行ったことです:
ExecutorService e = Executors.newFixedThreadPool(3);
while (j>0)
for ( i=0;i<j;i++,j--)
e.execute(new Merger<E>(db,cmp,i,j));
しかし、最初に完了する必要のある以前のマージがまだ完了していない間に、いくつかのマージが開始されました。(実行中のスレッドがマージが完了する前にループを終了したことは言うまでもありません...)そして、それにより私のプログラムは例外を追い出しました。
これは私ができないことですが、やりたいことなので、あなたの助けが必要です:
ExecutorService e = Executors.newFixedThreadPool(3);
while (j>0) {
for ( i=0;i<j;i++,j--)
e.execute(new Merger<E>(db,cmp,i,j));
wait for e to announce that all runnables have finished running;
}
私の意見では、これは機能するはずです。そうでない場合は理由を説明してください。とにかく、どのように行われたか知りたいです。
(基本的に、私は自分のバージョンの FixedThreadPool を実装してそれをヘッペンにすることができますが、私はそうではありません)