[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: JDK1.2でのThread.stopを調べていて



In article <199903041759.CAA09492@xxxxxxxxxx>
Toru Takahashi wrote:
>private volatile Thread blinker;
>:
>public void run() {
>  Thread thisThread = Thread.currentThread();      // ここの行がなぜ必要?
>  while(blinker == thisThread) {
(while内復元します)
      try {
        thisThread.sleep(interval);
      } catch (InterruptedException e){
	}
      repaint();
>  }
>}
>:
>public void stop() {
>  blinker = null;
>}
>
>別スレッドの処理を終えるときにblinkerをnullにすればrun()が終わるのは分るの
>ですが、
>run()メソッドの最初の行でなぜcurrentThread()を取得してblinkerと比較させてい
>るのか
>分かりませんでした。自分で書くなら、
>  while(blinker != null) {
>と書いてしまいますが。


>  while(blinker == thisThread) {
と
>  while(blinker != null) {

の違いは、あの記述だけを見た限りでは同じと言えます.

あのサンプルコードは、blinkerに一度しかThreadオブジェクトしか入らな
いという前提で書かれているわけではないために
>  while(blinker == thisThread) {
こうなっているのではないでしょうか.

例えばstop()メソッドでblinker = null;が実行されて、run()側のwhile文
を抜ける前に別の個所でblinkerに新たなThreadが設定されて、再実行が行
われるかもしれません.
その場合、
>  while(blinker != null) {
だと最初のThreadが終わってくれないということになりますね.

# もっと深い意味があるかもしれませんが.

因みに、
>  Thread thisThread = Thread.currentThread();      // ここの行がなぜ必要?
は単にcurrentThread()を二回(whileの中でも)使用しているから、と見てい
ますがどうでしょう...
# while内でsleep()がblinkerではなくthisThreadに対して行う必要がある
# ことは説明不要ですもんね.

=====================================
木下 信@イデア
=====================================