研究帖32

 

 

 

 


作者へのメッセージ
研究課題 パソコンと本は仲良く使おう

研究課題 パソコンと本は仲良く使おう

 

   

 

そよ風さん「インボークレーターは、どうやって使いますか?」

ナイス博士「そうだなあ、とにかく、マルチスレッドが分らないとだめだな。」

そよ風さん「そうですね、じゃあ、やって見ましょうか。」

ナイス博士「うん、最初だから、なるべく簡単にやろう。」

そよ風さん「じゃあ、メインから2つのスレッドを作って、交互に文字を表示して見ましょう。はいっ

 

アプレットはない!

Test1.javaのコード

User.javaのコード

Writer.javaのコード

 簡単なクラス図

 

 

ナイス博士「あれっ、なんでアプレットがないんだね?」

そよ風さん「wait()は、アプレットではうまく動かないそうなんです。」

ナイス博士「そうか、でも、これでは表示がどうなったかわからないぞ。」

そよ風さん「そうですね。じゃ、結果を書きます。」

 

 

*************************************************************************

【Test1.javaの表示画面】

start

1:run

2:run

1:run

2:run

1:run

2:run

end

*************************************************************************

 

ナイス博士「なるほど、うまく順番に表示されたな。」

そよ風さん「ええ、スレッドが、メインをいれて合計3つ出来ますけど、順番を守って表示する には、synchronaizedや、woit()や、notifyAll()や、join()をうまく使わないといけないんです。」

ナイス博士「へえ、そうなのか。で、これが何の役に立つんだい?」

そよ風さん「いろいろ使えますよ。たとえば、私たち3人がパソ山さんや、何でも入門書を 使う時、順番を守って上手に使わないと喧嘩になりますよね?」

ナイス博士「まあ、私はとにかく、君たちは喧嘩するだろうな。」

そよ風さん「ええ、で、誰かが使っている時はロックして使用中と表示して、使い終わったら ロックを開いて全員に知らせるんです。」

ナイス博士「ああ、なるほど。」

そよ風さん「そういうプログラムなら、Userのインスタンスを3つ作って、Writerの インスタンスを2つ作って、Userを私たち、Writerをパソ山さんと、何でも入門書にして、 Test1を書き換えればいいんです。」

ナイス博士「なるほどね。要領は大体分ったぞ。」

そよ風さん「じゃ、さっそく....」

ナイス博士「いやっ、ちょっと待ってくれ。どうせやるならもっとうまくやろう。」

そよ風さん「ええっ、どうするんですか?」

 

ナイス博士「Writerでやっている事は、大体こんな感じじゃないか?」

 

 

*************************************************************************

【Writer.javaの機能(ふるまい)】

1.呼び出したUserのロックが開いているかどうか判断する。

2.開いてなければ呼び出したスレッドを待たせる。

3.開いていたら、何かする。(この場合、番号(id)と、"run"と表示する。)

4.終わったら、ロックを変える。(この場合、idを書き換える。)

5.notifyAll()で、終わった事を全員に通知する。

*************************************************************************

 

そよ風さん「ええ、そうですね。」

ナイス博士「で、こういう機能は、いろんな場合に必要だと思うんだ。」

そよ風さん「ええ、でも、判断の方法や、その後の動作は、全部場合によって違って くるんじゃないですか。」

ナイス博士「うん。だから、違ってくる所を分けて、メソッドにするんだ。たとえば、」

 

 

 

*************************************************************************

【Writer.javaの機能をわける】

1.Userから呼び出すメソッド。

---public void getWork(Object key)

2.getWork(Object key)の中で、呼び出したUserのロックが開いているかどうか判断するメソッド。

---public boolean setWait(Object key)

3.開いてなければ待たせる。

---これは、ほとんどの場合共通して使える。

4.開いていたら、何かする。

---public void work()

5.終わったら、ロックを変える。

---public void change()

6.notifyAll()で、終わった事を全員に通知する。

---これは、ほとんどの場合共通して使える。

*************************************************************************

 

そよ風さん「博士、なんで、public void getWork(Object key)のkeyはObject型に したんですか?」

ナイス博士「プログラムによって、どんな型のKeyを使うか分らないから、Objectにしておけば、 ラッパークラスが使えるだろう?」

そよ風さん「ああ、なるほどねえ。後で、他でも使えるようにするんですね。で、 抽象クラスを作っておいて、場合によってそれぞれのメソッドを書き換えるんですか?」

ナイス博士「いや、どうせやるなら、インターフェイスも定義して、使い方を決めておくんだ。」

そよ風さん「インターフェイスですか!インターフェイスを作るのは初めてですね。」

ナイス博士「うん、今年の目標に入っているから、やってみよう!」

そよ風さん「はいっ!........出来ました!

 

 

 

アプレットはない!

Test2.javaのコード

Staff.javaのコード

SingleWorkOnly.javaのコード

SingleWorker3.javaのコード

StudyItem.javaのコード

 簡単なクラス図

 

ナイス博士「おお!あいかわらず早いな。」

そよ風さん「まあね、で、これが表示結果です。」

 

 

*************************************************************************

【Test2.javaの表示結果】

ナイス博士、パソ山さんを、使う。

---ナイス博士、パソ山さんを、使い終る。

ナイス博士、何でも入門書を、使う。

そよ風さん、パソ山さんを、使う。

---そよ風さん、パソ山さんを、使い終る。

BB君、パソ山さんを、使う。

---ナイス博士、何でも入門書を、使い終る。

そよ風さん、何でも入門書を、使う。

---BB君、パソ山さんを、使い終る。

ナイス博士、パソ山さんを、使う。

---ナイス博士、パソ山さんを、使い終る。

---そよ風さん、何でも入門書を、使い終る。

BB君、何でも入門書を、使う。

そよ風さん、パソ山さんを、使う。

---BB君、何でも入門書を、使い終る。

ナイス博士、何でも入門書を、使う。

---ナイス博士、何でも入門書を、使い終る。

---そよ風さん、パソ山さんを、使い終る。

BB君、パソ山さんを、使う。

そよ風さん、何でも入門書を、使う。

---BB君、パソ山さんを、使い終る。

ナイス博士、パソ山さんを、使う。

---そよ風さん、何でも入門書を、使い終る。

   

-----続く---------

   

*************************************************************************

 

ナイス博士「おおっ、うまく行ったな!」

そよ風さん「ええ、思った通りですね。で、次はどうします?」

ナイス博士「そうだなあ、じゃ、swingで使っているイベントディスパッチスレッドみたいに、 キューを使って順番割り当てが出来るかどうか、やって見ようか。」

そよ風さん「ああ、なるほどね、やって見ましょう。」

 

続く。

 

」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」

作者へのメッセージ

 

研究課題に戻る。

 見学者への注意事項に戻る。