問題タブ [blockingqueue]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java ScheduledExecutorService プロデューサー\コンシューマー
次のプロジェクトがあります。
Spring(3.2) ベースの Web アプリケーション (Tomcat 7)、バックグラウンドでいくつかのタスクがあります。
処理する情報を含むキューがあります。このキューは定期的に更新されます (ただし、空になったときのみ)。
また、このキューとプロセスから定期的にデータをキューに入れるスレッドがいくつかあります。
スケジューリングには、ScheduledExecutorService を使用したいと考えていました。
いくつかの問題\質問があります:
このキューを維持する方法は? 私はそれがグローバルであるべきだと思うので。「ホルダー」クラスで静的にする必要がありますか? これは下手なデザインではないでしょうか?
このキューとすべてのタスクを ScheduledExecutorService で初期化するのに適した場所はどこでしょうか? ServletContextLoadingListener は適切な場所ですか? これをSpringで開始する方法はありますか?
コンシューマ スレッドの数を正確に制御する必要がある場合、複数の ScheduledExecutorService インスタンスを使用する必要がありますか?
この場合、ArrayBlockingQueue は適切でしょうか?
java - BlockingQueue が空になるまでブロックする方法は?
BlockingQueue
aが空になるまでブロックする方法を探しています。
マルチスレッド環境では、プロデューサーがアイテムを に入れている限りBlockingQueue
、キューが空になり、数ナノ秒後にアイテムでいっぱいになる状況が発生する可能性があることを私は知っています。
ただし、プロデューサーが1 つしかない場合は、アイテムをキューに入れるのを停止した後、キューが空になるまで待機 (およびブロック) する必要がある場合があります。
Java/疑似コード:
何か考えはありますか?
EDIT:ラップBlockingQueue
して追加の条件を使用するとうまくいくことはわかっています。事前に作成されたソリューションやより良い代替案があるかどうかを尋ねているだけです。
java - ServletContextAttributeListener の BlockingQueue
データを(継続的にキューにデータを追加している ServletContextListener で開始されたスレッドから)ServletContextAttributeListener に転送しようとしています。
キューからのデータは、「attributeReplaced」で通知される接続されたクライアントに渡す必要があります。
データは BlockingQueue に含まれています。
しかし、私はちょっと混乱しています。呼び出してコンテキストに BlockingQueue を配置している場合
質問: コンテキストには、このキューまたはポインターのコピーが含まれていますか?
キューをコピーするだけなら、キューをコンテキストに追加しても意味がないからですよね? それとも、別の方法でこの問題を解決しますか?
トーマス。
java - Javaでの永続的なブロッキングキュー?
TL;DR; パフォーマンスの高い永続的なブロック キューを備えたライブラリがあるかどうかを知る必要があります。
私は古典的な生産者/消費者プログラムを持っています。それらLinkedBlockingQueue
はデータを共有するために a を共有しBlockingQueue#take
、新しい要素を待って永遠に生き続ける必要があるため、Consumer でメソッドを使用します。
問題は、大量のデータがあり、それらを失うことができないことです。コンシューマーが停止した後でも、プロデューサーは持続してデータを生成できます。H2
BlockingQueue ta を実装して、しきい値に達した後にデータを保存/取得することを考えています。私の主な問題は、パフォーマンスが必要であり、作成された順序で要素を消費する必要があることです。
このようなものに使用できる永続的なブロッキング キューの実装はありますか? そうでない場合、このようなことを達成するための提案はありますか?
java - Java、ブロックされたキュー
ブロッキング キューについて読んでいて、特定の質問が表示されました。私が読んだすべての例は、1 つのコンシューマー スレッドと 1 つのプロデューサー スレッドしかない状況のみを示しています。問題は、1 つのプロデューサーと 3 つのコンシューマーがあり、現時点ではすべてのコンシューマーが take() メソッドと呼ばれているが、キューが空であるため、最初の要素が表示されるのを待っているとします。最初の要素が表示されたときに、どのコンシューマー スレッドが最初の要素を受け取るか? take() を最初に呼び出した消費者スレッドは?
java - 生産者消費者(多数)。コンシューマーは共有キューを取り、そこに入れます
私は生産者消費者プログラムを作りました。これは、GUI (Swing または SWT) のないコア Java の単なるプログラムです。オブジェクトをキューに入れるプロデューサーが 1 つあります。また、その共有キューのすべてのオブジェクトにスタッフ (文字列など) を追加する必要があるコンシューマーもいくつかあります。したがって、すべてのコンシューマーは、共有キュー内のすべてのオブジェクトを処理する必要があります。この場合、すべての BookShelf には、「books」ArrayList 内のすべてのコンシューマーからのアイテムが必要です。消費者。
質問:スレッドを正しく終了するには、コンシューマーでどの条件を使用する必要がありますか? プログラムのコードの一部を次に示します。多分私は間違った方法でそれを実装しました。
キューのオブジェクトは次のとおりです。
}
プロデューサークラスは次のとおりです。
}
これは消費者クラスの1つです:
メインクラスは次のとおりです。
java - BlockingQueues の ArrayList の同期
ArrayList
Java では、 60秒のオブジェクトが必要LinkedBlockingQueue
です。まだシングルスレッドである間、プログラムの開始時に 60 秒になりArrayList
ます.add()
。LinkedBlockingQueue
次に、1 つのスレッドがs に移動し.add()
、LinkedBlockingQueue
別のスレッドが に移動し.poll()
ます。このオブジェクトを明示的に同期する必要はありますか?