HOME»基本情報技術者平成22年秋期問題»午後問11
基本情報技術者過去問題 平成22年秋期 午後問11
⇄問題文と設問を画面2分割で開く⇱問題PDF問11 ソフトウェア開発(Java)
次のJavaプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
(Javaプログラムで使用するAPIの説明は,こちらを参照してください。
〔プログラムの説明〕
電子会議システムのプログラムである。
電子会議は,サーバに接続しているクライアント間で行われ,一つのクライアントは,会議の参加者1人に対応する。会議に参加するときは,電子会議システムのサーバにログインする。参加者の発言はクライアントからのメッセージとしてサーバに送られる。サーバは受信したメッセージを,発信元クライアントを含む全クライアントに配信する。会議から退出するときは,ログアウトする。
この電子会議システムのサーバを実装するために,次のクラスを定義する。
(Javaプログラムで使用するAPIの説明は,こちらを参照してください。
〔プログラムの説明〕
電子会議システムのプログラムである。
電子会議は,サーバに接続しているクライアント間で行われ,一つのクライアントは,会議の参加者1人に対応する。会議に参加するときは,電子会議システムのサーバにログインする。参加者の発言はクライアントからのメッセージとしてサーバに送られる。サーバは受信したメッセージを,発信元クライアントを含む全クライアントに配信する。会議から退出するときは,ログアウトする。
この電子会議システムのサーバを実装するために,次のクラスを定義する。
- クラス MessageQueue は,クライアントからのメッセージを格納するための 待ち行列(メッセージキュー)である。メッセージは,先入れ先出しで管理される。メソッド put は,引数 message で与えられたメッセージをメッセージキューに追加する。メッセージキューに格納できるメッセージ数には制限があり,満杯のときは,空きができるまで待つ。メソッド take は,メッセージキューの先頭からメッセージを取り出す。メッセージキューが空のときは,メッセージが追加されるまで待つ。
- クラス ConfServer は,サーバを定義する。クライアントとのログイン状態を管理し,メッセージの受信と配信を行う。ここでクライアントとは,(3)で説明する抽象クラスの型のインスタンスである。クラス ConfServer は,クラスが初期化されるときにインスタンスが作成され,単独のスレッドとして動作する。メソッド run は,メッセージキューからメッセージを取り出し,ログインしている全クライアントにそのメッセージを配信する。この操作を繰り返す。メソッド login は,入れ子クラス ConfServere.Session のインスタンスを生成し,それをキーとしてクライアントを管理テーブルに登録し,そのインスタンスを返す。クライアントが既に登録されている場合は,IllegalArgumentException を投げる。クライアントが管理テーブルに登録されているとき,そのクライアントはサーバにログインしている状態であるとする。
- 抽象クラス ConfClient は,サーバが必要とするクライアントの機能を定義する。サーバは,メソッド displayMessage を呼び出してクライアントにメッセージを配信する。クライアントは,このクラスを実装しなければならない。クライアントがサーバにメッセージを送信するときは,ログイン時に返されたクラス ConfServer.Session のインスタンスのメソッド writeMessage を呼び出す。クライアントがログアウトするときは,同じインスタンスのメソッド logout を呼び出す。
- サーバをテストするために,クラス TestClient を定義する。このクラスは,ConfClient で定義されたメソッドをテスト用に実装する。TestClient のインスタンスは,サーバに対してクライアントの役割をする。メソッド displayMessage は,メッセージを次の形式で出力する。発信クライアント名: メッセージ >受信クライアント名
設問1
プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
- !queue.isEmpty()
- queue.isEmpty()
- queue.size() != MAX_SIZE
- queue.size() < MAX_SIZE
- queue.size() == MAX_SIZE
b に関する解答群
- session.get(message)
- session.get(server)
- session.get(sessionsTable)
- sessionsTable.get(message)
- sessionsTable.get(server)
- sessionsTable.get(session)
c に関する解答群
- queue
- server
- session
- sessionsTable
- this
d に関する解答群
- abstract
- extends
- Implements
- static
- throws
e に関する解答群
- super()
- super(name)
- super(this)
- this()
- this(name)
解答選択欄
- a:
- b:
- c:
- d:
- e:
解答
- a=イ
- b=カ
- c=オ
- d=イ
- e=イ
解説
この設問の解説はまだありません。
設問2
クラス MessageQueue のメソッド put 及び take には,synchronized修飾子が付けられている。これには理由が二つある。一つは,キューの状態(空又は満杯)によってスレッド間でメソッド wait 及び notifyAll を 呼び出して同期を取るためである。もう一つの理由として適切な答えを,解答群の中から選べ。
解答群
- クラス ConfClient のインスタンスがそれぞれ別スレッドとして同時に動くことを 想定すると,一度にフィールド queue で参照される LinkedList のインスタンスにアクセスが集中することが考えられる。そこで,一時点で queue にアクセスできるスレッドを一つにして,システムに負荷がかかりすぎるのを防ぐ。
- クラス ConfClient のインスタンスがそれぞれ別スレッドとして同時に動くことを想定すると,タイミングによってはフィールド queue で参照される LinkedList のインスタンスに格納されている他のスレッドが書き込んだメッセージを読み出すことができ,セキュリティ上問題となる。そこで,一時点で queue にアクセスできるスレッドを一つにして,queue に既に書き込まれているメッセージを読み出せないようにする。
- クラス ConfClient のインスタンスとクラス ConfServer のインスタンスは 別スレッドとして動くので,フィールド queue で参照されるLinkedListのインスタンスに 対しての操作が同時に実行されることがある。そこで,一時点で queue にアクセスできるスレッドを一つにして,データの内部状態に矛盾が起きないようにする。
- クラス ConfClient のインスタンスの個数が多いとフィールド queue で 参照される LinkedList のインスタンスに格納するメッセージ数の増大によってメモリ不足によるエラーが発生し,ConfServer を実行しているスレッドが停止する可能性がある。そこで,ConfClient のインスタンスの個数を制限して,エラーを起こさないようにする。
解答選択欄
解答
- ウ
解説
この設問の解説はまだありません。