• ベストアンサー

Thread処理について、教えてください!

はじめまして、いきなりですが質問させて頂きます。 sleep()メソッドは、Threadクラスのクラスメソッドであるため、 Thread.sleep();と書けば、main()メソッドの処理を一時停止できると 書いていました。 sleep();と書けば、Threadのrun()メソッドが一時停止するのはわかりますが、なぜ、sleep();にThread.を付けたらmain()メソッドが停止するのかわかりません。 なぜなのか、簡単に教えてください。

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

  • ベストアンサー
回答No.2

こんばんは。 http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/java/lang/Thread.html#sleep(long) によれば、 >public static void sleep(long millis) throws InterruptedException >現在実行中のスレッドを、指定されたミリ秒数の間、スリープ (一時的に実行を停止) させます。スレッドはモニターの所有権を失いません。 だし、Java 6 の Thread.Sleep http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Thread.html#sleep(long) を読んでも、やっぱり static メソッド(クラスメソッド)で、現在実行中のスレッドが対象だから、 Thread.sleep(); は sleep(); とは書けないと思います。 だから、 >なぜ、sleep();にThread.を付けたらmain()メソッドが停止するのかわかりません。 において、Threadをつけることで、sleep();の実行対象が main になるという認識が誤り。 RunnableインターフェースをImplementし、run メソッドを実装したクラスを、インスタンス化して、start(); すれば、スレッド起動されるが、スレッド起動されたクラスにおいても、自分自身を止めるには、sleep(); ではなく、Thread.Sleep(); と書きます。 ここがわかりやすいかな。 http://www.nextindex.net/java/thread/sleep.html マルチスレッドの考え方はあってます。 シングルスレッドとは、 public static void main(String[] args) で書いたmainメソッドも、Java仮想マシンがスレッド実行しており、この中でスレッドを生成していないなら、スレッドは1つしかない(mainメソッド)という意味。このとき、mainメソッドに、Thread.sleep();と書けば、mainメソッドの実行が止まる、ということですね。 Java 5.0のAPIリファレンスを参考URLにつけといたので熟読してください。:-)      

参考URL:
http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html
rescue99
質問者

お礼

ありがとうござます! JavaTM 2 Platform Standard Edition 5.0 API 仕様のことをリファレンスと言うのですね。 コンストラクタ、メソッドの使い方はわかりますが、入れ子のクラス・フィールドの使い方がわかりません。 スレッドに設定できる最高優先順位の付け方とかさっぱりです。 MAX_PRIORITY このリファレンスを見て、理解できるほど読解力がまだ備わっていないようです。 入れ子のクラスとか意味がわかりません。使い道も。。

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

こんばんは。#2です。 お礼いただきありがとうございます。 ご返信の内容かすると、比較的難解であるJavaのマルチスレッドプログラミングではなく、まず、市販の入門書などで、Javaの基本を勉強されたようがよいような気がします。こちらがおすすめです。 http://www.amazon.co.jp/exec/obidos/tg/detail/-/4797331828/ref=cm_lm_fullview_prod_1?_encoding=UTF8&v=glance >JavaTM 2 Platform Standard Edition 5.0 API 仕様のことをリファレンスと言うのですね。 リファレンスマニュアルというのは、言語における”キーワード”を個別に詳細に説明したものです。Javaであれば、クラス、メソッドの説明になります。reference=参照ですから、辞書のように、いつも手元においておくもの。プロのプログラマーであっても、すべてのクラスやメソッドを知っているわけではありません。 >コンストラクタ、メソッドの使い方はわかりますが、入れ子のクラス・フィールドの使い方がわかりません。 >入れ子のクラスとか意味がわかりません。使い道も。。 というご返信は、(あなたがそういうつもりであったとしても)この質問からは論点がずれてしまっていますね。少々、厳しい言い方ですが、Thread.Sleepの話を理解したのかも、書いてないですし。 老婆心ながら、入れ子クラスの用途は、外部のクラスから、内部のやりとりを隠蔽できる/パブリックなクラスにするほどでもないクラスを内部で定義して、プログラムのわかりやすさを高める/クラスファイルが増えない、などの利点がありますが、入門レベルではインナークラスの必要性について考える必要はありません。 ともかく、リファレンスを使えるようになるためには、Java言語を理解している必要があります。言語の修得は、とりあえず、やってみることが非常に重要ではありますが、言語仕様を理論的に整理する段階にあるような気がします。前述の書籍などで学ばれるか、新しい質問を起こすなどして、対応しましょう。(^^)      

rescue99
質問者

お礼

Thread.Sleepは理解できました。ありがとうございます。 やさしいJavaを読みました。 東大卒の女の方ですごいと思いました。 いまは立て続けにやさしいJava活用編を読んでいます。 もうちょっとJavaを知ってからリファレンスを読解したいと思います。 ありがとうございました!! この質問は締め切らせて頂きます。

すると、全ての回答が全文表示されます。
  • yaguma
  • ベストアンサー率57% (4/7)
回答No.3

Thread.sleep()メソッドは、そのメソッドを呼び出したスレッドを一時停止させる機能を持っています。 main()メソッドも、メインスレッドというひとつのスレッドによって実行されますので、main()内部でThread.sleep(1000)と記述した場合、メインスレッドの実行を一時停止させることができます。 >sleep();と書けば、Threadのrun()メソッドが一時停止するのはわかりますが >なぜ、sleep();にThread.を付けたらmain()メソッドが停止するのかわかりません。 sleep()メソッドの呼び出し方による違いに混乱されてるようですが、sleep()と書こうとThread.sleep()と書こうと機能はまったく同じです。 問題は、どのスレッドによって呼び出されるかです。 例えば、以下のコードのsleep()メソッドをThread.sleep()に書き換えたからといって、動作は変わりません。どちらも同じように、このrunメソッドを実行しているスレッドを一時停止させます。 /* Threadクラスのrun()メソッドをoverride */ public void run(){ System.out.println("thread-start"); try{ sleep(1000); //Thread.sleep(1000); }catch(InterruptedException e){ } System.out.println("thread-end"); }

rescue99
質問者

お礼

ありがとうござます! JavaTM 2 Platform Standard Edition 5.0 API 仕様のことをリファレンスと言うのですね。 コンストラクタ、メソッドの使い方はわかりますが、入れ子のクラス・フィールドの使い方がわかりません。 スレッドに設定できる最高優先順位の付け方とかさっぱりです。 MAX_PRIORITY このリファレンスを見て、理解できるほど読解力がまだ備わっていないようです。 入れ子のクラスとか意味がわかりません。使い道も。。

すると、全ての回答が全文表示されます。
  • com58
  • ベストアンサー率37% (3/8)
回答No.1

J2SEのリファレンスはご覧になったでしょうか? sleep()はメソッドを止めるのではなく、現在実行中のスレッドを休止させるものです。リファレンスにもそう記述してあります。 ご質問の状況ではシングルスレッドのプログラミングとなっていて、そのため、sleep()でメインスレッドを休止させているのではないかと思われます。 一度隅々までリファレンスを読んでみてはいかがでしょうか。

rescue99
質問者

お礼

ありがとうござます! リファレンスを見て勉強してます。 一時停止なので、sleep(1000);と書けば、1秒後にrun()メソッドが再開されます。 Thread.sleep(1000);と書けば、1秒後にmain()メソッドが再開されます。 スレッドを生成した時点でmain()メソッドからrun()メソッドが平行して実行されるので、 スレッド=マルチスレッドではないのですか? ???シングルスレッドとはなんでしょうか??? Thread.sleep(1000);で、なぜmain()メソッドが休止するのか知りたいのですorz

rescue99
質問者

補足

↓の回答へのお礼で、リファレンスを見て勉強していると書きましたが、正しくはJ2SEのリファレンスではなく、 Sun MicrosystemsにあるThe Java Tutorialsというページで勉強してましたorz J2SEのリファレンスのURLを教えて頂けたらうれしいです!お願いします!

すると、全ての回答が全文表示されます。

関連するQ&A