各スレッドが必要な入力を待って計算を行い、最後にその出力値を特定のスレッドに送信する必要があるスレッドセットがあります。処理されたメッセージを特定のスレッドに送信
私はスレッドの名前とスレッド自体を含むグローバルマップを持って、各スレッドが名前で "後継者"スレッドを取得してからそれらの値を送るようにする予定です。
まず、私は、ブロッキングキューを使用して生産者 - 消費者の例を見て:
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) {
queue = q;
}
public void run() {
try {
while(true) {
System.out.println("Waiting for input");
consume(queue.take());
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
void consume(Object x) {
System.out.println("Received: " + x);
}
}
class Setup {
public static void main(String...args) {
BlockingQueue q = new ArrayBlockingQueue<String>(10);
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
私は、各スレッドのブロッキングキューを持っていると考えていました。コンシューマースレッドは、すべての目的の値を受け取るまで、queue.take()をループします。
この後、私はこのpostを見つけました。そこに私と同様の質問が尋ねられます。提案されたソリューションは、ブロッキングキューソリューションよりも簡単に思えます。メッセージを送信するスレッドのメソッドを呼び出すことに基づいています。
私は2つのアプローチのどちらが最善であるか、あるいは私が望むものを達成するためのよりよい方法があるかについてアドバイスをお願いしたいと思います。
ありがとうございました。
は、あなたの答えをいただき、ありがとうございます。交換器は私が必要とするもののように見え、あなたが正しいですが、私が指摘した他の解決策は良く見えません。最後の質問があります。複数のスレッドがあり、プロデューサが特定のスレッドにメッセージを送信したい場合、どうすればよいですか?スレッドごとに1つのExchangerインスタンスが必要ですか?もし愚かな質問であれば申し訳ありませんが、私は車輪を再発明したくありません。ありがとうございました! –
ラファエル:質問をあなたが望むものの正確な詳細で更新するだけです。 (消費者/プロデューサのコードはちょうどノイズ、fyiです)。エクスチェンジャーは1:1ブロック、バッファリングされていない*ハンドオフ*、ちょうどあなたがあなたのQを正確に指定する必要がある理由、データがどのように流れようとしているかなどのいくつかの考えを与えるためです。あなたに1:1 *パイプラインを表示する*おもちゃ*。 1:N、またはN:1? java.util.concurrent Queuesを参照してください。 – alphazero