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.