Java 応用問題5 平成16年度秋期問12 解説
解説 |
---|
設問1 a: aはlong sleepingに設定後に、 Thread.sleepメソッドに指定する、 現在のスレッドの実行を停止する時間になる。 スリープを行う条件としては、 nextCallTimeよりも現在時刻が早い場合に、 nextCallTimeの時間までスリープを行う必要があると考えられるので、 >ウ nextCallTime - System.currentTimeMillis() が正解。 b: >waitingList.notifyAll(); を行うブロックに関する指定である。 問のマルチスレッドプログラムで、 waitingListに対して操作を行う場合に waitingListオブジェクトで排他を行うsynchronizedブロックが プログラム1の中に2箇所存在し、bに関しても 同様にwaitingList.notifyAll()を行うために waitingListオブジェクトの排他を行う必要のある部分である。 >エ synchronized (waitingList) が正解。 c: waitingList.isEmpty() ->waitingListに空き待ちをしている利用者が登録されていない状態 かつ、CallCenterクラスのmainメソッドを実行している mainスレッドで、for文を抜けて >// すべてのオペレータのスレッドを終了させる/P> >running = false; まで処理が進んでいない状態であれば、 >waitingList.add(new Call(duration[i])); >waitingList.notify(); により、空き待ちをしている利用者が登録されるのを waitingList.wait()によって待つ処理。 (後の回答であるがdで行う処理をセットで考える) >イ && running が正解。 d: InterruptedExceptionの発生する処理であり、notifyではなくwaitである。 waitingListオブジェクトで排他を行っており、 waitを行う対象オブジェクトもwaitingListである。 >エ waitingList.wait() が正解。 e: Operatorのスレッドは、waitingListに空き待ちをしている 利用者が登録されている状態で、応答を続ける必要があり、 >ウ while ((call = answer()) != null) が正解。 >ア if ((call = answer()) != null) >イ if (answer() != null) は、一度しか実行されないため誤り。 >エ while (answer() != null) は、Call callにオブジェクトが設定されないため誤り。 f: 選択肢より、fはelapsedに対して計算を行う処理であり その結果をprintlnにより表示を行っている。 elapsedはms単位の実時間である。 s単位のシミュレートした時間(実時間の10倍) s単位にするためには/1000 シミュレートした時間にするためには*10 合わせた結果として/100とする必要があり、更に >// 経過時間を四捨五入して表示する/P> のコメントにあるように四捨五入を行う必要があるため、 >ア (elapsed + 50) / 100 が正解。 設問2 パラメータが ・オペレータ数:3 ・通話時間(秒):{70, 90, 100, 110} ・呼出しを発生させる間隔(秒):30 の場合の、 >(シミュレータの時間で)80秒後に通話中の状態にあるオペレータの人数 を図を描いて考える。 ※(実時間で8秒後)は、考える必要がない部分 0 10 20 30 40 50 60 70 80 90 100 ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼ 1 -1-------------------------- -4--... 2 -2--------------------------... 3 -3--------------... となり、80秒の時点では2番目、3番目の問い合わせにより オペレータ2、3の2人が通話中の状態となるので、 >ウ 2 が正解。 |
匿名様 ご投稿
メニューへ戻る