- ベストアンサー
Javaソースの初心者質問
- Javaのソースコードに関する初心者の質問です。
- mainメソッドやstartメソッドの処理の順番について疑問があります。
- ソースコードの処理の流れや意味について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
処理1は「処理」と言うよりは単にインスタンス変数の「宣言」です。 (加えてint pauseは宣言されていますが、使用されていません。) ですから、「処理1を実行する」ということもありません。 ソースコードThread.javaからの一部抜粋です。 /** * Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run</code> method of this thread. */ public synchronized void start() { if (started) throw new IllegalThreadStateException(); started = true; group.add(this); start0(); } private native void start0(); public void run() { if (target != null) { target.run(); } } Thread.run()中のtargetはThreadコンストラクタで登録されます。 gooo_goooさんの質問の場合、 targetはHelloThreadのインスタンスであるはずです。 Thread.start0()の内容を調べることができませんでしたが、 Thread.start()の注釈によれば、 Thread.start()はThread.run()を呼ぶということなので、 関数の実行順序は次のようになると思います。 Thread.start() -> Thread.start0() -> Thread.run() -> target.run() = HelloThread.run() ということで、Thread.run()内部で、HelloThread.run()を呼んでいると結論づけました。 (わかりにくい説明になってしまったと思います。SunのサイトからJDKソースコードを落とせるので、ご自身で調べてみるとより理解が深まると思います。)
その他の回答 (1)
質問への回答 (1) 処理の流れは以下の通り HelloThread.main()開始 HelloThread.start() -> Thread.start() -> Thread.run() -> HelloThread.run() (200ミリ秒毎にメッセージ出力) HelloThread.main() 1000ミリ秒停止 HelloThread.stop() -> th=null HelloThread.run() whileループを抜け停止 HelloThread.main()終了 プログラム終了 (2) その通りです。 (3) Thread.start()は内部でThread.run()を呼びます。 Threadインスタンスthにhelloが登録されているので、 Thread.run()内部でHelloThread.run()を呼びます。 (4) mainメソッドはThread.sleep(1000)で停止しますが、 その間もHelloThread.run()は動いています。 そのため、200ミリ秒毎にメッセージを出力します。 (5) コンストラクタですが、特に何も実行していません。
補足
HKBさん、回答ありがとうございます。 すみません… まだ疑問に思うことがあります。 //処理1 Thread th; int pause; というのはどういうタイミングで実行されるのでしょうか? それと、回答(3)についてですが Thread.start()は内部でThread.run()を呼びます。 Threadインスタンスthにhelloが登録されているので、 Thread.run()内部でHelloThread.run()を呼びます。 の最後の行のThread.run()内部はThread.start()内部 ではないでしょうか? 回答よろしくお願いします。
お礼
ご丁寧に説明して頂き、ありがとうございました。