26‐1
(1) スレッドとして起動されて動作するクラスの定義方法として2つあります。あるクラスを継承する方法と、あるインターフェースを実装する方法です。そのクラスとインターフェースは何ですか。
(2) (1)の2つの方法のどちらの場合でも、あるメソッドをオーバーライドする必要があります。そのメソッドは何ですか?

26‐2
短距離走者をモデルとするSprinter01という次のようなクラスを作成しなさい。
・スレッドとして動作することを前提とするので、あるクラスを継承する。
・名前を表すprivateでString型のnameというフィールドをもつ。
・10メートルを走るのに必要なミリ秒数(ラップタイム)を表すprivateでint型のrapというフィールドをもつ。
・コンストラクタの引数で、名前とラップタイムを指定させる。ただし、コンストラクタの引数の名前はフィールド名と同じにする。
・スレッドとしての処理は、100メートルを走るということを想定する。まず、名前とスタートした旨を出力し、その後ラップタイムの時間分処理を停止して、名前と10メートル毎にスタート地点からの距離を出力する。

26‐3
次のような処理を行うExer26_03というクラスを作成・コンパイル・実行し、結果を確認しなさい。
・適当な名前・ラップタイムを指定して、上記のSprinter01のインスタンスを3個生成し、それらをスレッドとして起動する。
・main()メソッドでは上記の処理以外に何かする必要はない。

26‐4
上記Sprinter01をあるクラスを継承するのではなく、あるインターフェースを実装するように変更し、Sprinter02というクラスを作成しなさい。

26‐5
上記Exer26_03をSprinter02を使用するように変更し、Exer26_05というクラスを作成・コンパイル・実行し、結果を確認しなさい。

26‐6
上記Exer26_05を、全員が100メートルを走り終わった後、すなわち起動した全てのスレッド終了を待って、"レースが終了しました"と出力するように変更し、Exer26_06というクラスを作成・コンパイル・実行し、結果を確認しなさい。

26‐7
金庫をモデルとするCashbox01という次のようなクラスを作成しなさい。
(1) 簡単のため、この金庫は一万円札のみを保管し、なおかつ、最初は1枚しかないとする。
(2) この金庫がその時点で保管する一万円札の数を表すprivateなint型のnumberというフィールドをもつ。当然初期値は1とする。
(3) この金庫から一万円札を1枚借りて何かを行ってそれを返すという処理を、publicでvoid型のborrowというメソッドとして定義する。borrow()は借りる人の名前を表すString型の引数を1個もつ。具体的なborrow()の処理は次の通りとする。
・numberフィールドを1だけ減らす。
・引数で受け取った名前の人が借りた旨とその時点でのnumberの値を出力する。
・1秒間処理を止める。
・numberを1だけ増やして戻す。
・引数で受け取った名前の人が返した旨とその時点でのnumberの値を出力する。

26‐8
上記の金庫を使用する職員をモデルとするStaff01という次のようなクラスを作成しなさい。
(1) スレッドとして動作することを前提とするので、Runnableインターフェースを実装する。
(2) その職員の名前を表すprivateなString型のnameというフィールドをもつ。
(3) その職員が使用する金庫を表すprivateなCashbox01型のcashboxというフィールドをもつ。
(4) コンストラクタの引数で、名前と金庫を指定させる。ただし、コンストラクタの引数の名前はフィールド名と同じにする。
(5) スレッド、すなわちrun()メソッドの処理としては、金庫から一万円札を1枚借りる処理を行う。具体的には次の通り。
・cashboxフィールドが参照するCashbox01インスタンスのborrow()メソッドを呼び出す。引数は自分の名前を指定する。

26‐9
一つの金庫から3人の職人がほぼ同時に一万円を借りることを想定し、次のようなExer26_09というクラスを作成・コンパイル・実行し、結果を確認しなさい。
(1) 上記Cashbox01のインスタンスを生成する。
(2) 適当な名前と、(1)で生成したインスタンスを指定して、Staff01のインスタンスを3個生成し、スレッドとして起動する。

26‐10
上記Exer26_09をは、金庫が保管しているお札の数がマイナスになるという実際にはあり得ないことが起こる。Cashbox01を変更して、その現象を回避しなさい。