• ベストアンサー

スレッド

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つの処理を同時に処理するためと覚えてください」 と切り捨てられてしまいました。 これは正しいでしょうか・・・? 記述の足りない部分は補足いたします。 ご指摘お願いします。

  • Java
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • 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の中身を繰り返す、ということではないでしょうか 結局はそれでいいようです。 僕もそう思いました。 ありがとうございましたーーー

関連するQ&A

  • javaのwaitしてるスレッドをnotifyで起こすことが出来ない

    JDK1.5 WindowsXPです。 現在マルチスレッドを試しています。 A、B、C三つのスレッドがあります。 AはBというスレッドを作るメインスレッドです。 Bは、waitするスレッドです。 public final void run(){  while (true){   try {    //notifyが来るまで待機    waitForNotify();    //実際の処理    act();    //スレッド停止させるための割り込み例外   } catch (InterruptedException e) {    Thread.currentThread().interrupt();    e.printStackTrace();   }   //割り込み受信の場合強制終了する   if (Thread.currentThread().isInterrupted()) {    break;   }  } } こんな感じです。 そしてCのスレッドがnotify()を実行します。 しかしnotify()を実行してもスレッドは起きません。 Bに、 public synchronized void notifyM() throws InterruptedException{   wait(); } のようなメソッドを追加して、スレッドのインスタンスメソッドとして実行しても起きません。 notify()がJavaDOCなどを読んでも意味不明なため、 どのような使い方なら動くのか見当がつきませんので質問しました。 notify(スレッドB)みたいなら分かりいいんですが。

    • ベストアンサー
    • Java
  • スレッド動かず

    本の真似をして、スレッドを書いてみたんですがに何も起こりませんでした。全く分かりません。どうすれば良いでしょうか? public class Frame1 extends Frame implements Runable{ ................. ................. Thread kick = new Thread(this); int time; public void start() { if (kick ==null) kick.start(); } public void run() { while (kick == Thread.currentThread()) { time++; String s = Integer.toString(time); textArea1.append( s + "\r\n"); try{ Thread.sleep(1000); }catch(InterruptedException e){} } }

    • ベストアンサー
    • Java
  • スレッドが実行中かどうかの確認

    画面の中にボタンを作成し、そのボタンを押すとスレッドが実行される機能を作成しました。 「一度ボタンを押してスレッドが実行中の場合は処理を実行しない」 という処理を実装したいです。 上記の処理を以下のソースで考えていますが(1)の部分がわかりません。 そもそも(1)のようなことが可能かもわかっていない状況です。 (1)のようなことは可能なのでしょうか? どなたか、知恵を貸していただければと思います。 よろしくお願い致します。 /* ソース */ public class ExThread1 extends Thread{  public void run() {   // 処理  } } public class TEST {  public static void main(String[] args){   ExThread1 thread1 = new ExThread1();   // (1)スレッドが実行中ならstartしない   if(スレッドが実行中ではない){    thread1.start();   }  } }

    • ベストアンサー
    • Java
  • 初心者です。

    javaのソースについて質問です。 次のソースに関していくつか質問させて下さい。 public class HelloThread implements Runnable { //処理1 Thread th; int pause; public static void main(String args[]) { HelloThread hello; //処理2 hello = new HelloThread(); hello.start(); //処理3 try{ Thread.sleep(1000); } catch (Exception ex) { } //処理4 hello.stop(); } public HelloThread() { } public void start() { //処理5 th = new Thread(this); th.start(); } public void run() { //処理6 while(th != null) { System.out.println("Hello World!"); try { Thread.sleep(200); } catch (Exception ex) { } } } public void stop() { //処理7 th = null; } } 質問 (1)mainメソッドのhello = new HelloThread();で HelloThreadクラスの処理1の2行が実行されると 思いますが、その後にhello.start();が実行される のでしょうか? (2)hello.start();で処理5が実行されるのでしょうか? (3)th.start();でrun()が呼び出されるのでしょうか? (4)処理6を実行している間、処理3、4が実行される のでしょうか? 出来ればその理由も教えて下さい。 (5)このソースの処理4の後のpublic HelloThread()は 何か意味があるのでしょうか? 以上、初心的な質問だと思いますが、よろしくお願いします。

    • ベストアンサー
    • Java
  • マルチスレッド:スレッドの終了を検知する(Ruby)

    2つ以上のスレッドを生成・動作させ、それらが終了した時点で、メインに処理を移すといったことをRubyでしたいと思っています。 (スレッドが1つならば、メインをstopさせておき、スレッドの終了時に例外処理などを使ってrunさせる方法は思いつくのですが。。) 一つ考えたのは・・・ カウンタ変数をつくり、一つのスレッドが終了したらその値を増やす。 メインではwhileループによってその値を常に数えて、全スレッドの終了を把握する。 ただ無駄にwhileループを回してしまいます。。 一般的な効率の良い手段等あるのでしょうか?

  • C#のスレッド動作について

    下記はスレッドの中で永久ループさせるテストプログラムで、1秒毎にテキストボックス内の数値をインクリメントします。 【問題点1】 ※1と※2のコマンドを削除した状態(※3のみ)で正常な動作を期待していたのですが、実際にはフリーズ状態となり、カウント値が表示されません。 ※2のApplication.DoEvent()を実装するか、※3の替わりに※1に実装すると正常動作となります。 ExecThread実行中は他の処理を出来なくても、これを抜けた時点で表示処理に移るので表示される筈と思っていたのですが違う様です。 【問題点2】 Invokeの替わりにBeginInvokeを使えばExecThread実行中でも他の処理と並列処理されると思っていたのですが、スレッドを2個用意して試したところInvokeと全く変わらず、やはりフリーズ状態となります。 【問題点3】 ExecThreadを匿名メソッドにすると「フィールド初期化子は、静的でないフィールド、メソッド、又はプロパティ'iCount'を参照できません」のエラーとなり、「iCount」をstatic変数にするとOKになります。 匿名メソッドではインスタンス変数は使えないのでしょうか。 上記3項目についてネットで調べたのですがその様な記述は見当たりませんでした。 何か使い方が間違っているのでしょうか? 間違い点など、ご指摘頂ければ有難いです。 どうぞ宜しくお願いします。 private void ExecWorker() ← スレッド {   while (true)   {     Invoke(new Exec1Delegate(this.ExecThread)); ← BeginInvokeを使っても症状は同じ     iCount++;     Thread.Sleep(1000); ← ※1 このSleepが無いとフリーズする     Application.DoEvent(); ← ※2 これがあると※1のSleepが無くてもOK   } } delegate void ExecDelegate(); private void ExecThread() {   lbThread.Text = iCount.ToString(); ← 匿名メソッドにするとエラーになる   Thread.Sleep(1000); ← ※3 (※1のSleepと同時実装はしない) }

  • スレッド

    スレッドは同時に複数の実行はできないそうですが、同時に複数の処理を行うと書かれています。実行とは開始という意味でしょうか?

    • ベストアンサー
    • Java
  • スレッドについて

    スレッドについて勉強中なのですが、簡単なスレッド作り、 スレッドの処理が終わってからメインの処理を行わせたくて 以下のようなプログラムを書いてみました。 そこで、WaitForSingleObjectを使ってスレッドが終了するのを 待ちたいのですが、WaitForSingleObjectではまってしまうようで sprintfのメッセージ(スレッドが止まってしまっている)が 表示されません。 WRITE関数の処理が終われば、、WaitForSingleObjectで処理が 戻ってくると考えているのですが…。 スレッドについてと、間違いについて教えてもらえないでしょうか? 宜しくお願いします。 main { if(!stop) {   File = CreateFile(...); g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; }else { g_stop = true; ::WaitForSingleObject(g_hThead, INFINITE); CloseHandle(File); CloseHandle(hThead ); } } void WRITE() { while(!g_stop) { WriteFile(...); } ...処理を行う sprintf("スレッドを終了します。") }

  • Javaのメソッドについて

    Javaの参考書を見ていて分からない点があります。 Kadaiクラスで使用したcurrentThreadメソッドは、 Thread.currentThread()と書いてもthis.currentThread()と書いても 実行結果が同じになります。 currentThreadメソッドは静的メソッドなのに、 なぜthis.currentThread()でも良いのか分かりません。 this.currentThread()も静的メソッドなのでしょうか? class SampleThread{ public static void main(String[] args){ Thread t1=new Kadai(); t1.setName("Minimum"); //スレッド名を設定 t1.setPriority(Thread.MIN_PRIORITY); //優先順位を設定 Kadai t2=new Kadai(); t2.setName("Normal"); t2.setPriority(Thread.NORM_PRIORITY); Kadai t3=new Kadai(); t3.setName("Maximum"); t3.setPriority(Thread.MAX_PRIORITY); t1.start(); //プライオリティが最低のスレッドを実行 t2.start(); //プライオリティが普通のスレッドを実行 t3.start(); //プライオリティが最優先のスレッドを実行 } } class Kadai extends Thread{ public void run(){ Thread t=this.currentThread(); //スレッド情報を取得 System.out.println("スレッド名:"+t.getName()+" プライオリティ:"+t.getPriority()); } }

    • ベストアンサー
    • Java
  • スレッド1とスレッド2を交互に実行するには?

    スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか? どうしてもデッドロックが発生しうる方法しか思いつかず困っています。 例えば以下のプログラムで1212と交互に表示させたい場合です。 以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。 Object obj; //スレッド間通信用のobject class Test1 extends Thread {  public void run() {   while(true) {    System.out.print("1");    synchronized (obj) {     obj.notify();//相手をnotifyして     obj.wait();//自分はwait    }   }  } } class Test2 extends Thread {  public void run() {   while(true) {    System.out.print("2");    synchronized (obj) {     obj.notify();     obj.wait();    }   }  } } new Test1().start(); new Test2().start();

    • ベストアンサー
    • Java

専門家に質問してみよう