3

私はJavaが初めてで、演習としてスレッド化されたライブラリを書きたいと思っています。このように動作します。

メイン スレッドでは、いくつかのジョブ (文字列として) がジョブ キューに追加され、ワー​​カー スレッドがジョブを終了すると、ジョブが終了キューに追加されます。メイン スレッドは、終了したキューから結果を取得します。すべてのジョブが完了すると、メイン スレッドはワーカーに停止するように通知します。これまでに書いたいくつかのコードは次のとおりです。

public List<int> get() {
    WorkerThread[] threads = new WorkerThread[numThreads];
    LinkedList<int> results = new LinkedList<>();
    int workCount = 0;

    for (int i = 0; i < numThreads; i++) {
        threads[i] = new WorkerThread();
        threads[i].start();
    }
    // reader is a BufferedReader
    while ((String line = reader.readLine()) != null) {
        // put string to job queue
        workCount++
    }
    while(workCount) {
        //result = get result from finished queue, and add it to results LinkedList
        workCount--;  
    }
    for (int i = 0; i < numThreads; i++) {
        threads[i].canStop(); // this sets a private variable that makes infinite while loop to stop
        threads[i].join();
    }
    return results;
}

しかし、これに使用する Queue 実装の種類について混乱しています。ドキュメントには、11 種類の Queue 実装が示されています。

4

3 に答える 3

1

ConcurrentLinkedQueueは、リンクされたノードに基づく無制限のスレッド セーフなキューです。

多くのスレッドが共通のコレクションへのアクセスを共有するが、このクラスが null 要素の使用を許可しない場合、これは適切な選択です。

このリンクには、マルチスレッドに使用できるさまざまなキュー実装の比較が含まれています。

于 2013-08-12T12:06:22.983 に答える
0

キューは多くの異なるスレッドからアクセスされるため、おそらく java.util.concurrent のキュー実装の 1 つを使用する方が効率的です。他のキューでは、明示的な同期が必要になる場合があります。

ArrayBlockingQueueたとえば、制限付きリング バッファーを実装してみてください。制限されているという事実は、ジョブが処理できるよりも速く送信されたときに、自動的にバック プレッシャーを適用することを意味します。キューは、メモリが不足するまで増加し続けるわけではありません。

実装は主にパフォーマンス特性が異なり、異なるジョブ負荷は異なるキューから恩恵を受ける可能性があります。状況に最適なオプションをテストする必要があります。

于 2013-08-12T12:06:28.990 に答える