さまざまな種類のデバイス(それぞれのプロトコルを使用)と通信するプログラムを開発しています。デバイスからメッセージを同時に取得し、特定の形式のファイルに書き込む必要があります。タイミングは非常に厳しいため、2つのスレッドとして実装することにしました。1つはデバイスからメッセージを取得し、もう1つはメッセージを書き込みます。両方のスレッドに共通のオブジェクトはメッセージキューです。
取得スレッドDeviceHandler
を開始するスレッドDeviceDriver
があります。私の意見では、messageQueue
オブジェクトはDeviceHandler
に属している必要があり、DeviceDriver
にあるため冗長であり、結合が増加します。このスレッドを開始するDeviceDriver
のacquire
メソッドに渡すことにしましたが、messageQueue
をインスタンス変数にせずにこれらを組み合わせる方法がわかりません。
さらに、デバイスからメッセージを取得することは大きなタスクであるため、DeviceDriver
の実装者は独自のメッセージリクエスターを使用します。これにより、何らかの方法でキューを取得し、実際にメッセージで埋めることができます。ここでも同じ問題があります。また、実装の詳細により、DeviceBDriverRequestor
がスレッドとして実行される場合があります。
だから私は質問があります:
messageQueue
をDeviceDriverのインスタンス変数にすることを避けていますか?それともどこにでも持っていても構いませんか?DeviceDriver
クラス(run()
メソッドとacquire(Queue messageQueue)
メソッドの組み合わせ)を実装するための良い方法は何でしょうか?前もって感謝します!
複数の引数でスレッドを開始できない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が必要になると思います。
単純なアダプタパターンと考えてください。
キューをDeviceDriver
内に隠し、スレッドセーフな委任によって必要なメソッド(get
、clear
など)を公開してみませんか?
このようにして、DeviceDriver
クラスのユーザーはその実現を気にせず、実際に必要なものだけを使用し、DeviceDriver
は不必要な依存関係を持ちません。