[解決済み] ConcurrentLinkedQueueの使い方を教えてください。
質問
どのように
ConcurrentLinkedQueue
をJavaで使うのですか?
これを使用して
LinkedQueue
を使用して、私はキューの並行性について心配する必要がありますか?それとも、2つのメソッド(リストから要素を取得するメソッドとリストに要素を追加するメソッド)を定義すればいいのでしょうか?
注:明らかにこれら2つのメソッドは同期されなければなりません。そうでしょうか?
EDITです。 私がやろうとしていることはこれです。私は、キューからアイテムを取得するための1つのメソッドを持つクラス(Java)と、キューにアイテムを追加するための1つのメソッドを持つ別のクラスを持っています。追加された項目とリストから取得された項目は、私自身のクラスのオブジェクトです。
もう1つの質問:私はremoveメソッドでこれを行う必要があります。
while (queue.size() == 0){
wait();
queue.poll();
}
コンシューマとプロデューサは1つずつしかありません。
どのように解決するのですか?
いいえ、メソッドを同期させる必要はありませんし、メソッドを定義する必要もありません。これらはすでに ConcurrentLinkedQueue に含まれているので、それを使用すればよいのです。ConcurrentLinkedQueue は、必要なロックやその他の操作をすべて内部で行います。プロデューサーがキューにデータを追加し、コンシューマーがそれをポーリングします。
まず、キューを作成します。
Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>();
さて、producer/consumer オブジェクトを作成するときは、キューを渡してオブジェクトを置く場所を確保します (このためにセッターを使うこともできますが、私はこの種のことはコンストラクタで行う方が好きです)。
YourProducer producer = new YourProducer(queue);
とする。
YourConsumer consumer = new YourConsumer(queue);
を作成し、プロデューサーでそれに何かを追加します。
queue.offer(myObject);
で、コンシューマでいろいろ取り出します(キューが空の場合、poll()はnullを返すので、それをチェックします)。
YourObject myObject = queue.poll();
より詳しい情報は Javadocを参照してください。
EDITです。
キューが空にならないように待つブロックが必要な場合、おそらくは リンクドブロッキングキュー(LinkedBlockingQueue を使用し、take() メソッドを使用します。ただし、LinkedBlockingQueueには最大容量(デフォルトはInteger.MAX_VALUEで、20億以上)があるので、状況によって適切な場合とそうでない場合があります。
1 つのスレッドがキューにデータを入れ、別のスレッドがキューからデータを取り出すだけであれば、ConcurrentLinkedQueue はおそらく過剰な処理です。これは、何百、何千ものスレッドが同時にキューにアクセスするような場合に適しています。
あなたのニーズは、おそらく
を使用することによって満たされるでしょう。
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
この利点は、インスタンス(キュー)をロックすることで、複合操作の原子性を保証するためにキュー上で同期することができます(Jaredが説明したとおりです)。すべての操作はインスタンスをロックせずに行われるため、ConcurrentLinkedQueueでこれを行うことはできません(java.util.concurrent.atomic変数を使用します)。キューが空の間は poll() は単に null を返し、 poll() はアトミックなので、キューが空の間にブロックしたい場合は、これを実行する必要はありません。poll() が null を返すかどうかを確認します。もしそうなら、wait()をして、もう一度試してください。ロックする必要はありません。
最後に
正直なところ、私はLinkedBlockingQueueを使うだけでいいと思います。あなたのアプリケーションにとってはまだ過剰ですが、うまくいく可能性は高いです。もし十分なパフォーマンスが得られない場合(PROFILE!)、いつでも他のものを試すことができますし、同期されたものに対処する必要がないことを意味します。
BlockingQueue<YourObject> queue = new LinkedBlockingQueue<YourObject>();
queue.put(myObject); // Blocks until queue isn't full.
YourObject myObject = queue.take(); // Blocks until queue isn't empty.
他はすべて同じです。置く おそらく はブロックしません。なぜなら、20億個のオブジェクトをキューに入れることはないでしょうから。
関連
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
配列定数は初期化子でのみ使用可能です。
-
eclipse にリソースリーク:'in' が閉じない
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] ConcurrentHashMapとCollections.synchronizedMap(Map)の違いは何ですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
強制型変換について
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
Junitのユニットテストエラー
-
java 365*1000*60*60*24 計算問題
-
Zipファイルの圧縮・解凍にantを使用する
-
[解決済み] LinkedBlockingQueueとConcurrentLinkedQueueの比較