hotspot/src/share/vm/runtime/thread.cpp
static void ensure_join(JavaThread* thread) {
{- -------------------------------------------
(1) (なお, この処理では Threads_lock を取得する必要は無い. なぜなら処理対象は自分自身だから)
---------------------------------------- -}
// We do not need to grap the Threads_lock, since we are operating on ourself.
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
Handle threadObj(thread, thread->threadObj());
assert(threadObj.not_null(), "java thread object must exist");
{- -------------------------------------------
(1) この後の処理で notify_all() を呼び出す必要があるので, ここでロックを取っておく.
---------------------------------------- -}
ObjectLocker lock(threadObj, thread);
{- -------------------------------------------
(1) このスレッドはどのみちもう終了するので, 例外が起こっていたとしても無視する.
そのために ThreadShadow::clear_pending_exception() を呼んで pending_exception を消しておく.
---------------------------------------- -}
// Ignore pending exception (ThreadDeath), since we are exiting anyway
thread->clear_pending_exception();
{- -------------------------------------------
(1) このスレッドはもう終了するので,
対応する java.lang.Thread オブジェクトの thread_status フィールドの値を TERMINATED に変更しておく.
---------------------------------------- -}
// Thread is exiting. So set thread_status field in java.lang.Thread class to TERMINATED.
java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
{- -------------------------------------------
(1) このスレッドはもう終了するので,
対応する java.lang.Thread オブジェクトの eetop フィールドを NULL に戻しておく.
(これにより, java.lang.Thread.isAlive() が false を返すようになる.
See: [here](no30595cP.html) for details)
---------------------------------------- -}
// Clear the native thread instance - this makes isAlive return false and allows the join()
// to complete once we've done the notify_all below
java_lang_Thread::set_thread(threadObj(), NULL);
{- -------------------------------------------
(1) ObjectLocker::notify_all() を呼んで,
カレントスレッドに対応する java.lang.Thread オブジェクトに対して wait() で待機していたスレッドを起床させる.
(これは java.lang.Thread.join() を実現するための処理.
See: [here](no3059vOq.html) for details)
---------------------------------------- -}
lock.notify_all(thread);
{- -------------------------------------------
(1) このスレッドはどのみちもう終了するので, 例外が起こっていたとしても無視する.
そのために ThreadShadow::clear_pending_exception() を呼んで pending_exception を消しておく.
---------------------------------------- -}
// Ignore pending exception (ThreadDeath), since we are exiting anyway
thread->clear_pending_exception();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.