研究帖37

 

 

 

 


作者へのメッセージ
研究課題 invokeLaterの謎

研究課題 invokeLaterの謎

 

   

 

ナイス博士「おいっ、インボークレーターを使ってるぞ!!」

そよ風さん「ああっ、なるほど!こうやって使うのね!」

ナイス博士「君は、前に棒の切り取り問題で使って見たんだろう?」

そよ風さん「そうですけど、チュートリアルのサンプルに載っていたのと同じようにやっても うまく行かなかったんです。」

ナイス博士「そうか。で、このコードでは、どうやってるんだ?」

そよ風さん「うーーん、やっぱりマルチスレッドを使ってイベントディスパッチスレッドを 空けないとだめなようですね。要するにですね...」

 

 

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

【大バケツソートでのinvokeLaterの使い方】

*イベントディスパッチスレッドをなるべく早く空ける。

 

1.計算中ではない事を表すフラグを作って初期値をtrueにしておく。 

2.ボタンが押されたらフラグを見て、計算中ならそのことを表示してすぐメソッドを終わらせる。

3.計算中でなければ、"計算を開始します。"と表示してフラグを計算中(false)にする。

4.別なスレッドを作ってそこで計算用メソッドを動かし、このメソッドはすぐ終わらせる。 

5.計算が終わって、コンポーネントを書き換える時は、invokeLaterで呼び出し、イベントキューの 最後に入れて、後で書き換えるようにする。

6.最後にフラグをtrueに戻す。

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

 

アプレットを開く。

RunnableApplet.javaのコード

Bucket.javaのコード

 

   

 

ナイス博士「うーーん、結構面倒なんだなあ。..」

そよ風さん「ええ、swingはシングルスレッドポリシーと言って、コンポーネントの書き換えも イベントディスパッチスレッドでやるから、そこを早く空けないと、ボタンが使えなくなっちゃうんです。」

ナイス博士「なるほどねえ、でもこれさえ分れば、いろんな事が出来るぞ!」

そよ風さん「そうですね、"棒の切り取り問題"も、完成させられるかもしれません!」

 

   

 

そよ風さん「ところで博士、こんな所にガラクタを積み上げて山にしておくと、危ないですよ!」

ナイス博士「うん。わかってるよ。片付けるつもりでいたんだ。」

そよ風さん「早くやらないと、だれかがうっかり触ったら、ガシャガシャーーン!!って音を 立てて崩れますよ!」

ナイス博士「だから、わかってるって言ってるじゃないか。」

 

リリーーンッ!リリーーンッ!

 

そよ風さん「あれっ、居間で電話が鳴ってますよ!」

ナイス博士「ああ、じゃ、居間に移動しよう。」

 

二人は居間に移動したのだった。

 

   

 

ナイス博士「もしもし、もしもし、...」

電話の声「はっ、博士!僕です、BBです!!」

ナイス博士「おおっ!BB君!いったいどうしたんだ!!!」

電話の声「はっ、博士!僕です、BBです!!」

ナイス博士「わかったよ!で、いったいどうした...」

電話の声「はっ、博士!僕です、BBです!!」

ナイス博士「そよ風さん、この電話、おかしいぞ!」

そよ風さん「どれ、ちょっと変わって下さい..もしも..」

電話の声「はっ、博士!僕です、BBです!!」

そよ風さん「博士じゃないわ!私よ!」

電話の声「はっ、博士!僕です、BBです!!」

そよ風さん「博士!これってきっと録音ですよ!」

ナイス博士「いったいだれがこんないたずらを!!」

 

ガシャガシャーーン!!

女の声しっ、しまった!!

 

そよ風さん「はっ博士!研究室で大きな音がしましたよ!」

ナイス博士「何事だ!!見て来る!」

 

二人は研究室に移動した。

 

 

     

そよ風さん「うわっ!あなたっ、何やってるの?」

ナイス博士「おいっ、君っ、いつのまに戻ったんだ!!」

謎の女しっ、しまった!!!!

 

続く。

 

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

作者へのメッセージ

 

研究課題に戻る。

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