web-dev-qa-db-ja.com

異なる通信クラスで同じオブジェクトを表すフィールドを持つことを避けることは合理的ですか?

さまざまな種類のデバイス(それぞれのプロトコルを使用)と通信するプログラムを開発しています。デバイスからメッセージを同時に取得し、特定の形式のファイルに書き込む必要があります。タイミングは非常に厳しいため、2つのスレッドとして実装することにしました。1つはデバイスからメッセージを取得し、もう1つはメッセージを書き込みます。両方のスレッドに共通のオブジェクトはメッセージキューです。

取得スレッドDeviceHandlerを開始するスレッドDeviceDriverがあります。私の意見では、messageQueueオブジェクトはDeviceHandlerに属している必要があり、DeviceDriverにあるため冗長であり、結合が増加します。このスレッドを開始するDeviceDriveracquireメソッドに渡すことにしましたが、messageQueueをインスタンス変数にせずにこれらを組み合わせる方法がわかりません。

さらに、デバイスからメッセージを取得することは大きなタスクであるため、DeviceDriverの実装者は独自のメッセージリクエスターを使用します。これにより、何らかの方法でキューを取得し、実際にメッセージで埋めることができます。ここでも同じ問題があります。また、実装の詳細により、DeviceBDriverRequestorがスレッドとして実行される場合があります。

class diagram

だから私は質問があります:

  1. messageQueueをDeviceDriverのインスタンス変数にすることを避けていますか?それともどこにでも持っていても構いませんか?
  2. 私が提案した方法でDeviceDriverクラス(run()メソッドとacquire(Queue messageQueue)メソッドの組み合わせ)を実装するための良い方法は何でしょうか?
  3. そのような状況に対処するためのいくつかの良い習慣はありますか?

前もって感謝します!

5
miuser

複数の引数でスレッドを開始できないCとは異なり(pthread void ** param:D)、Javaスレッドは、引数なしでメソッドrunの実行のみを許可します。( https://stackoverflow.com/questions/877096 ありがとう@RobertHarveyを参照)。

フィールドを使用してパラメータをスレッドに渡すことはできません。

ただし、抽象側では、DevideDriverは必ずしも1つのスレッドではないため、DeviceDriverをスレッドの側面から切り離すことができます。

したがって、DeviceDriverのメソッドrun()DeviceDriverThreadに移動し、メソッドrun(MessageQueue queue )からDeviceDriver

このDeviceDriverThreadは、フィールドとしてMessageQueueと具体的なDeviceDriverを実行し、このメソッドを実行すると次のようになります。

private MessageQueue queue;
private DeviceDriver deviceDriver;
public void run(){
     deviceDriver.run(queue);
}

DevideDriverThreadでもメソッドstopが必要になると思います。

単純なアダプタパターンと考えてください。

1
Walfrat

キューをDeviceDriver内に隠し、スレッドセーフな委任によって必要なメソッド(getclearなど)を公開してみませんか?

このようにして、DeviceDriverクラスのユーザーはその実現を気にせず、実際に必要なものだけを使用し、DeviceDriverは不必要な依存関係を持ちません。

0
Pavlus