java.nio を考えなければ, 以下のメソッドでブロックしているスレッドを起こすだけ. 内部的には, 待機対象の ParkEvent 等について unpark() を呼ぶだけ (ただし, 一部にプラットフォームによって変わる箇所がある).
java.nio については, (#Under Construction).
仕様では java.lang.Thread.join() にも割り込めることになっている.
java.lang.Thread.join() についてはコード中では特に処理は行っていないが, join() が内部で wait() を使っているので wait() に割り込めるなら join() にも割り込める(と思われる) (See: here for details).
java.lang.Thread.interrupt() -> JVM_Interrupt() (= java.lang.Thread.interrupt0()) -> Thread::interrupt() -> os::interrupt() -> OS によって処理が異なる. * Linux の場合 -> OSThread::set_interrupted() -> os::PlatformEvent::unpark() (java.lang.Thread.sleep() に割り込むため) -> Parker::unpark() (java.util.concurrent.locks.LockSupport.park() に割り込むため) -> os::PlatformEvent::unpark() (java.lang.Object.wait() に割り込むため) * Solaris の場合 -> OSThread::set_interrupted() -> os::PlatformEvent::unpark() (java.lang.Thread.sleep() に割り込むため) -> Parker::unpark() (java.util.concurrent.locks.LockSupport.park() に割り込むため) -> os::PlatformEvent::unpark() (java.lang.Object.wait() に割り込むため) -> thr_kill() (java.lang.Thread.sleep() に割り込むため) * Windows の場合 -> OSThread::set_interrupted() -> SetEvent() (java.lang.Thread.sleep() に割り込むため) -> Parker::unpark() (java.util.concurrent.locks.LockSupport.park() に割り込むため) -> os::PlatformEvent::unpark() (java.lang.Object.wait() に割り込むため)
(java.nio でブロックしている場合は, さらに以下が呼び出される) -> #TODO
See: here for details
See: here for details
java.lang.Thread.interrupt0() は JVM_Interrupt() で実装されている.
((cite: jdk/src/share/native/java/lang/Thread.c))
static JNINativeMethod methods[] = {
...
{"interrupt0", "()V", (void *)&JVM_Interrupt},
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.