2

ユーザーが指定した特定の数までの素数を計算し、その数を出力する単純なJavaアプリケーションがあります。これに基づいて、4 つの個別の数値範囲を反復処理する 4 つの個別のスレッドを組み込みました。4 つのスレッドすべてが反復を完了したら、最終的な ArrayList を出力します。

4 つのスレッドを開始した後、コードの次の行は、現在アクティブなスレッドの少なくとも 1 つによって変更されている ArrayList を印刷しようとする print ステートメントであるため、現在 ConcurrentModificationException を取得しています。

したがって、4 つのスレッドがすべて終了した後に print ステートメントを実行できるようにしたいと考えています。さらに、回転ループを使用せずにこれを実行したいと考えています。回転ループの使用に特に反対することはありませんが、これを行うためのより良い方法があり、回転ループがかなりの量のCPU。

4

3 に答える 3

4

4 に初期化されたCountDownLatchを使用します。印刷スレッドawaitsはラッチであり、ワーカー スレッドはcountdown終了する前にラッチを呼び出します。

ArrayList4 つのスレッドが一度に変更している場合は、適切に同期するようにしてください。代わりにConcurrentLinkedQueueを使用することもできます(または、ArrayListスレッドごとに異なるものを使用します)。

于 2013-05-21T03:07:38.600 に答える
2

を使用しCountdownLatchます。そのクラスの Javadoc には、

  1. メイン スレッドは、スレッドの数でラッチを作成します。
  2. メイン スレッドは、すべての作業スレッドを開始します。
    1. 各スレッドには、ラッチへの参照があります。
    2. 作業が完了すると、ラッチをカウントダウンします。
  3. メインスレッドは、ラッチが 0 までカウントダウンするのを待ちます。
  4. メインスレッドは印刷ジョブを実行します。
于 2013-05-21T03:07:47.087 に答える
0

java.util.concurrent.BlockingQueueを使用する場合、各スレッドput()は終了時にブロッキング キューにアイテムを入れることができます。

print ステートメントの前に、コードはtake()ブロッキング キューからa を実行し、take()各スレッドに対して が 1 回返された場合にのみ処理を続行できます。印刷スレッドは、take()何も取得できない間、ブロックされます。これにより、すべてのスレッドが終了するまで印刷が開始されないことが保証されます。

于 2013-05-21T03:06:09.020 に答える