これらは, HotSpot 内でのスレッド管理用のクラス (See: here and here for details).
スレッドに関する OS 依存な情報を管理するためのクラス. 1つの OSThread オブジェクトが 1つのスレッドに対応する.
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
// The OSThread class holds OS-specific thread information. It is equivalent
// to the sys_thread_t structure of the classic JVM implementation.
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
// I'd make OSThread a ValueObj embedded in Thread to avoid an indirection, but
// the assembler test in java.cpp expects that it can install the OSThread of
// the main thread into its own Thread at will.
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
class OSThread: public CHeapObj {
各 Thread オブジェクトの _osthread フィールドに(のみ)格納されている.
なお正確に言うと, Solaris や Windows の場合は, 「メインスレッド」を表す OSThread オブジェクトが以下のフィールドにも格納されている. しかし, これらのフィールドは使われていない.
以下の箇所で(のみ)生成されている.
* os::create_thread() (Linux の場合) (Solaris の場合) (Windows の場合) * os::create_attached_thread() (Linux の場合) * create_os_thread() (Solaris の場合) (Windows の場合)
そして, これらの関数は現在は以下のパスで(のみ)呼び出されている.
* メインスレッドの初期化処理 (HotSpot の起動時処理) (See: here for details) -> Threads::create_vm() -> Thread::set_as_starting_thread() -> os::create_main_thread() -> * Linux の場合: -> os::create_attached_thread() * Solaris の場合: -> create_os_thread() * Windows の場合: -> create_os_thread() * 各種スレッドの作成処理 JavaThread::JavaThread() -> os::create_thread() Threads::create_vm() (<= VMThread の作成処理) -> os::create_thread() WatcherThread::WatcherThread() -> os::create_thread() ConcurrentMarkSweepThread::ConcurrentMarkSweepThread() -> os::create_thread() GCTaskThread::GCTaskThread() -> os::create_thread() ConcurrentGCThread::create_and_start() -> os::create_thread() WorkGang::initialize_workers() -> os::create_thread() * JNI の AttachCurrentThread() 及び AttachCurrentThreadAsDaemon() の処理 (略) (See: here for details) -> attach_current_thread() -> os::create_attached_thread() -> * Solaris の場合: -> create_os_thread() * Windows の場合: -> create_os_thread()
OSThread::_state フィールドの型である ThreadState (enum 型) は legacy code なので JavaThread の state で書き換えたい, とのこと.
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
// The thread states represented by the ThreadState values are platform-specific
// and are likely to be only approximate, because most OSes don't give you access
// to precise thread state information.
// Note: the ThreadState is legacy code and is not correctly implemented.
// Uses of ThreadState need to be replaced by the state in the JavaThread.
enum ThreadState {
ALLOCATED, // Memory has been allocated but not initialized
INITIALIZED, // The thread has been initialized but yet started
RUNNABLE, // Has been started and is runnable, but not necessarily running
MONITOR_WAIT, // Waiting on a contended monitor lock
CONDVAR_WAIT, // Waiting on a condition variable
OBJECT_WAIT, // Waiting on an Object.wait() call
BREAKPOINTED, // Suspended at breakpoint
SLEEPING, // Thread.sleep()
ZOMBIE // All done, but not reclaimed yet
};
See: here for details
OSThread クラス用の補助クラス.
OSThread の状態(OSThread::_state)を作業途中のあるスコープの中でだけ OBJECT_WAIT や CONDVAR_WAIT にしておきたい, という場合に使われる補助クラス(StackObjクラス).
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
// Utility class for use with condition variables:
class OSThreadWaitState : public StackObj {
以下の箇所で(のみ)使用されている.
WatcherThread::run()
os::sleep() (Linux の場合)
Parker::park() (Linux の場合)
os::sleep() (Solaris の場合)
Parker::park() (Solaris の場合)
os::sleep() (Windows の場合)
Parker::park() (Windows の場合)
コンストラクタで OSThread::set_state() を呼んで状態を変更し, デストラクタで (同じく OSThread::set_state() を呼んで) 元に戻している.
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
OSThreadWaitState(OSThread* osthread, bool is_object_wait) {
_osthread = osthread;
_old_state = osthread->get_state();
if (is_object_wait) {
osthread->set_state(OBJECT_WAIT);
} else {
osthread->set_state(CONDVAR_WAIT);
}
}
~OSThreadWaitState() {
_osthread->set_state(_old_state);
}
See: here for details
OSThread クラス用の補助クラス.
OSThread の状態(OSThread::_state)を作業途中のあるスコープの中でだけ MONITOR_WAIT にしておきたい, という場合に使われる補助クラス(StackObjクラス).
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
// Utility class for use with contended monitors:
class OSThreadContendState : public StackObj {
以下の箇所で(のみ)使用されている.
コンストラクタで OSThread::set_state() を呼んで状態を変更し, デストラクタで (同じく OSThread::set_state() を呼んで) 元に戻している.
((cite: hotspot/src/share/vm/runtime/osThread.hpp))
OSThreadContendState(OSThread* osthread) {
_osthread = osthread;
_old_state = osthread->get_state();
osthread->set_state(MONITOR_WAIT);
}
~OSThreadContendState() {
_osthread->set_state(_old_state);
}
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.