アクティブオブジェクトとは
コンピュータープログラミングおよびエンジニアリングでは、アクティブオブジェクトとは、マルチスレッドシステムまたはコンカレントシステムで何らかのサービスを常に利用できるようにするために使用できる設計パターンの一種です。 アクティブオブジェクトとは、外部オブジェクトに実行の完了を待機させることなく、外部オブジェクトからの入力を受信および処理できるメカニズムを実装するオブジェクトです。 また、このメカニズムにより、すべて同時に実行されている可能性のある多くのオブジェクトがアクティブなオブジェクトを使用できるようになります。 これはほとんどの場合、アクティブオブジェクトをプロキシと呼ばれるパブリックにアクセス可能なインターフェイスにラップし、オブジェクト内にあるタイプのキューシステムを実装して、メッセージを後の処理のために保存することによって実現します。 これにより、オブジェクトがアクティブなオブジェクトにメッセージを送信し、アクティブなオブジェクトがメッセージを処理し、後で状態を更新できるように結果を呼び出し元のオブジェクトに通知するまで処理を続けるデザインパターンが作成されます。
アクティブオブジェクトのデザインパターンの外側では、通常のオブジェクトはパッシブオブジェクトと呼ばれる場合があります。 単純なプログラムの例では、パッシブオブジェクトがチャットサーバーリレーとして機能し、リモートオブジェクトがパッシブオブジェクトに接続してサーバー上の他の全員にメッセージを送信する場合があります。 パッシブサーバーオブジェクトは、リモートオブジェクトからチャットメッセージを受信するたびに、要求をすぐに処理してからすぐに出力を送信する必要があります。その間、リモートオブジェクトはプロセスが完了するまで実行を停止します。 プログラム内に異なるスレッドを作成すると、実行のブロックの問題を解決できますが、同期の問題が発生します。
アクティブオブジェクトのデザインパターンでは、上記の例の同じサーバーオブジェクトが、他のオブジェクトとは別の独自のスレッドで実行されます。 また、別のスレッド(場合によってはメインプログラム実行スレッド)で実行されているプロキシと呼ばれる何らかのタイプのインターフェイスでラップされます。 リモートオブジェクトがサーバーオブジェクトにチャットメッセージを送信させたい場合、プロキシオブジェクトに接続し、必要なすべての情報を渡し、待機する代わりに通常の実行状態に戻ります。
次に、プロキシインターフェイスは、リモートオブジェクトからの情報を、アクティブオブジェクトが処理するキューに渡すメッセージに変換します。 この時点で、プロキシインターフェイスとリモートオブジェクトの両方が実行を継続でき、ブロックされません。 一方、アクティブなオブジェクトはキューを空に保ち、各着信メッセージを処理します。 呼び出し元のオブジェクトがアクティブなオブジェクトによって返される情報を必要とする場合、コールバック構造を使用して、状態の変化をリモートオブジェクトに通知できます。