• ベストアンサー

スレッド

Thread th; //スレッド変数th宣言 public void start() {th = new Thread(); th.start();} //スレッドの開始 run(){Thread me = Thread.currentThread();      while(th == me){動作変数の処理} paint(){画像表示} 以上のような処理なのですが、 よく意味がわかりません。 特にwhile文の部分です。 currentThread とは?と聴いたところ 「現在実行中のスレッド」 だと言われました。 変数meに現在動作中のスレッドを代入する。 ??よく事情がわからないのです。 このプログラムはdrawOvalで丸を描いて、それを移動させると言うものなのですが、スレッドは2つ動いてると言うのです。動作変数処理と表示処理の2つだそうです。 で、meが動作、thが表示だと言うのですが正しいですか?まず通常動作するスレッドとth.start()で動くスレッドで、2つということはわかります。 で、現在実行中のスレッドと実行させたスレッドが等しい(trueまたはfalse)だと言うことが何を意味しているのか・・・????なのです・・・ これはどういうことなのでしょうか?? 質問してもまだ良くわからなそうなかおをしていたところ 「2つの処理を同時に処理するためと覚えてください」 と切り捨てられてしまいました。 これは正しいでしょうか・・・? 記述の足りない部分は補足いたします。 ご指摘お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

http://java.sun.com/j2se/1.4/ja/docs/ja/guide/misc/threadPrimitiveDeprecation.html このページの 「Thread.stop が推奨されないのはなぜですか」 をまず読もう。 次に、同ページの 「Thread.stop の代わりに何を使うべきですか」 を読むと、「推奨されないrun()メソッドの書き方(※でもわかりやすい)」と「推奨される書き方(※パッと見、わかりにくい)」の2つが書いてある。 で、この「推奨される書き方」、なんでこんなヘンチクリンなコードなのかというと、 その答えはココに書いてある。 http://sunsite.tus.ac.jp/java/javaj/jtutorial/applet/overview/threadExample.html (「繰り返しタスクの実行にスレッドを使用する」の項) ちなみに、azicyanさんに教えた人の説明とは、ちと異なってます(^^; ------------- あと、その人の 「2つの処理を同時に処理するためと覚えてください」 という言葉の意味は、 「スレッドを使いたい場合は、(よくわからないかもしれないが、)とりあえずこう記述しといてくれ」 という意味だと思います。当面はそれでいいんじゃないかな、とぼくも思います。 (sunのチュートリアルにも「詳しいことはともかく、とりあえず覚えとけ」みたいなこと書いてある http://java.sun.com/docs/books/tutorial/essential/threads/lifecycle.html)

azicyan
質問者

補足

ありがとうございますーー いろいろ本を探した結果、やっと見つかりました。 ずばり同じところにたどり着きましたよ(*^_^*) >ちなみに、azicyanさんに教えた人の説明とは、ちと異なってます(^^; ですね~。ちょっとへんでしたね。 >という意味だと思います あはは。そうですね~。 でも、ほとんど決まりごとなのであながち悪い意見だとは思いませんが。 ありがとうございましたーーー

その他の回答 (2)

  • Sephy
  • ベストアンサー率35% (7/20)
回答No.3

 #1でちゃんと答えられなかったのでスレッドについて少し勉強してきました。 >while(th == me)  この判定がスレッドの停止条件のようです。  たとえばどこか別のタイミングでth = null;のようにすると、while(th == me)は偽となりループから抜けます。この場合はスレッドの破棄と停止が一緒にできるということになるのでしょう。  そのためにcurrentThreadで現在のthの参照を得といたのでしょう。  もう少しスレッドで遊んで勉強してきます。

azicyan
質問者

お礼

stop()メソッドが推奨されないので、 その代わりとして、 スレッド変数にnullを代入して 代用するようです。 ありがとうございました

azicyan
質問者

補足

ありがとうございます。 >たとえばどこか別のタイミングでth = null;のようにすると、while(th == me)は偽となりループから抜けます。この場合はスレッドの破棄と停止が一緒にできるということになるのでしょう。 はい! すっきりわかりやすいご説明だと思います。 ありがとうございました! がんばります

  • Sephy
  • ベストアンサー率35% (7/20)
回答No.1

 このようなスレッドの使い方もあるんですね。質問のような書き方になじみがないのでどこまで答えられるかわかりませんが >meが動作、thが表示だと言うのですが正しいですか  は違うような気がします。  meはcurrentThreadの戻り値なのですから現在動作中のスレッドなんじゃないのでしょうか。  それがthと一致したら動作の処理をしているのでthが動作なのではないでしょうか。 >現在実行中のスレッドと実行させたスレッドが等しい  現在実行中のスレッド、つまりmeが、動作の処理用に新しく作ったスレッド、つまりthのときに、動作の処理をする、ということでしょうか。  できるだけ簡単に言うならば、thが実行中のときはwhileの中身を繰り返す、ということではないでしょうか。実行されるスレッドは他にもあるので。必ずme==thがtrueであるとは言えませんし。 >2つの処理を同時に処理するためと覚えてください  納得できたら覚えるべきだと思います。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Thread.html
azicyan
質問者

補足

回答ありがとうございます~ 僕なりにもいろいろ調べまして、 2のかたの回答がずばり、のようです。 STOPメソッドは推奨されない、ではどうかくか・・・? とリファレンスにもこのように書いてありました。 >は違うような気がします。 そうなんですよね。 ぼくもえ???と思いました。 meは、現在実行中のメソッドの参照変数なのに、 meがスレッド???へんだな、とおもいました。 >できるだけ簡単に言うならば、thが実行中のときはwhileの中身を繰り返す、ということではないでしょうか 結局はそれでいいようです。 僕もそう思いました。 ありがとうございましたーーー