hotspot/src/share/vm/runtime/thread.cpp
void JavaThread::thread_main_inner() {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(JavaThread::current() == this, "sanity check");
assert(this->threadObj() != NULL, "just checking");
{- -------------------------------------------
(1) JavaThread::entry_point() でエントリポイントを取得し, そのエントリポイントを呼び出す.
(ただし, この時点で例外が起こっている場合には, この処理は行わない)
(また, java_lang_Thread::is_stillborn() が true を返す場合にも, この処理は行わない.
これは, このスレッドに対して既に java.lang.Thread.stop() が呼ばれている場合.
java.lang.Thread.stop() は例外を起こすので, ある意味では上のケースの特殊例.
See: java.lang.Thread.stop())
---------------------------------------- -}
// Execute thread entry point unless this thread has a pending exception
// or has been stopped before starting.
// Note: Due to JVM_StopThread we can have pending exceptions already!
if (!this->has_pending_exception() &&
!java_lang_Thread::is_stillborn(this->threadObj())) {
HandleMark hm(this);
this->entry_point()(this, this);
}
{- -------------------------------------------
(1) (DTrace のフック点)
---------------------------------------- -}
DTRACE_THREAD_PROBE(stop, this);
{- -------------------------------------------
(1) JavaThread::exit() を呼んで, このスレッドに関する後片付けを行う.
---------------------------------------- -}
this->exit(false);
{- -------------------------------------------
(1) この JavaThread オブジェクトを解放して終了.
---------------------------------------- -}
delete this;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.