0

私はJavaマルチスレッドと同時実行ツールを使用するのは比較的新しいです。イベントプロデューサーを持つアプリを実装しています(それを と呼びましょうEventProducer)。EventProducerスレッド プールFixedThreadPoolがあり、処理するイベントごとに 1 つの新しいスレッドが送信され、新しいEventProcessorスレッドがプールに送信されます。

イベントが到着するたびに、プール内のスレッドが作成されています。EventProcessorしかし、問題は、そのスレッド (イベント要求ごとに固有) を、アプリケーション スコープであると想定される 2 つのスレッドと通信したいことです。つまりService1、アプリケーションにはそれらのインスタンスしかありませんService2。どちらにもスレッドプールがあり、タスクを同時に処理できます。

その特定EventProcessorは一連のタスクをに送信しService1、各タスクの応答を返します。その応答のために、 CompletionServiceを探しましたが、双方向通信用のブロッキング キューと統合する方法がわかりません。その後、その応答に応じて、 でEventProcessor実行するアクションまたは別のアクションを送信しService2ます。Service2は、そのアクションに関する応答も ​​に送信しEventProcessorます。

このような問題にどのように取り組むことができるかを知っている人はいますか? 最初のステップを達成するために紹介が必要です。アイデアをプールします。

4

4 に答える 4

3

スレッド間通信に最適なオブジェクトはBlockingQueue. それらは非常に柔軟でスレッドセーフであり、通常はすべての要件を処理します。

BlockingQueue<Task> queue = new LinkedBlockingQueue<>();
于 2013-02-18T16:41:40.320 に答える
1

最後に、次の方法でそれを解決することができました。実行可能なオブジェクトであるEventProducerサービスService1とを作成し、それらをスレッドとして起動します。Service2これらの各サービスは、として実装されているプールで結果を待ち続けますCompletionService。これらのサービス参照は保持され、イベントの起動時に作成さEventProducerれるすべてのへの参照によって渡されます。EventProcessor

EventProcessor2つのBlockingQueue要素があり、それぞれがサービスからの応答を受信するために使用されます。サービスを呼び出したい場合は、オブジェクトの参照を介してサービスのディスパッチメソッドを呼び出し、処理する要素のコレクションをパラメーターとして渡し、EventProcessorそれ自体の参照も渡します。呼び出しはのスレッドに従って行われますがEventProcessor、処理するオブジェクトごとに呼び出し可能なオブジェクトを作成し、サービスクラスにコードを実行して、新しいスレッドをプールに送信します。

結果が与えられると、自分のスレッドでそれを待っているサービスは、自分の参照を持っているので、それをのに入れBlockingQueueますEventProcessorEventProcessor結果を自分のスレッドに管理した後(そして他のアクションを他のサービスに送信できます)。

それがすべてです、助けてくれた人々に感謝します、あなたはあなたの賛成票を持っています、なぜならすべての答えが私にいくつかの概念を明らかにしたからです。

于 2013-02-20T09:19:19.367 に答える
1

ConcurrentLinkedQueueなど、イベント ディスパッチャ スレッドに非ブロッキング キューがある場合はどうなるでしょうか。次に、その参照を に渡し、Callable応答をキューに追加できるようにします。
イベント ディスパッチャーでは、定期的にキューをポーリングして、興味深いものがあるかどうかを確認できます。キューは非ブロッキングであるため、null空になると戻ります。

于 2013-02-18T17:08:13.923 に答える
1

Service1 と 2 をExecutorServices にします。EventProcessor は、応答をカプセル化する戻り型 R を使用して、タスクを Callables の形式で Service1 に送信します。また、結果の Future をキューに入れます。別のスレッドで、これらの応答を受け取り、新しい呼び出し可能オブジェクトを Service2 にディスパッチします。そのために CompletionService を使用することもできます。

于 2013-02-18T16:59:34.013 に答える