Java の標準クラスである java.lang.Thread クラスには以下の 2通りの使われ方がある.
java.lang.Thread のサブクラスを作って run() をオーバーライドする方法:
java.lang.Thread.start() を呼び出すと, 最終的に java.lang.Thread.run() をオーバーライドしたメソッドが呼び出される.
java.lang.Thread() のコンストラクタに java.lang.Runnable オブジェクトを渡す方法:
java.lang.Thread.start() を呼び出すと, 最終的にはオーバーライドされていない java.lang.Thread.run() メソッドが呼び出される.
この java.lang.Thread.run() メソッド内で渡された Runnable が呼び出される.
どちらの場合も, 処理の流れは大きく分けると以下の 2つからなる.
適当な Thread オブジェクト (あるいは Thread のサブクラスのオブジェクト) を生成する.
java.lang.Thread.start() を呼び出す.
この時に, HotSpot 内で JavaThread オブジェクトが生成され, 新しいネイティブスレッドの生成処理と開始処理が行われる.
スレッドの起動処理(全 Thread クラス共通部分) (See: here for details)
生成されたスレッドは java_start() から実行が開始される.
JavaThread は Thread::run() をオーバーライドしているので, java_start() からは JavaThraed::run() が呼び出される.
スレッドの起動処理(JavaThread 独自の部分)
JavaThread::run() からは, 最終的に JavaThread オブジェクト生成時に指定された thread_entry() 関数が呼び出される.
この thread_entry() 内で java.lang.Thread.run() が呼び出され, 生成されたスレッドのメイン処理が開始される.
スレッドの終了処理
生成されたスレッドのメイン処理が終わると, JavaThread::exit() による終了処理が実行される.
java.lang.Thread.<init>()
の処理java.lang.Thread.start()
の処理 This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.