Up Top

Thread の interrupt 処理 (java.lang.Thread.interrupt() の処理)


Under Construction

概要(Summary)

java.nio を考えなければ, 以下のメソッドでブロックしているスレッドを起こすだけ. 内部的には, 待機対象の ParkEvent 等について unpark() を呼ぶだけ (ただし, 一部にプラットフォームによって変わる箇所がある).

java.nio については, (#Under Construction).

備考(Notes)

仕様では java.lang.Thread.join() にも割り込めることになっている.

java.lang.Thread.join() についてはコード中では特に処理は行っていないが, join() が内部で wait() を使っているので wait() に割り込めるなら join() にも割り込める(と思われる) (See: here for details).

処理の流れ (概要)(Execution Flows : Summary)

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

処理の流れ (詳細)(Execution Flows : Details)

java.lang.Thread.interrupt()

See: here for details

JVM_Interrupt()

See: here for details

備考(Notes)

java.lang.Thread.interrupt0() は JVM_Interrupt() で実装されている.

    ((cite: jdk/src/share/native/java/lang/Thread.c))
    static JNINativeMethod methods[] = {
    ...
        {"interrupt0",       "()V",        (void *)&JVM_Interrupt},

Thread::interrupt()

See: here for details

os::interrupt() (Linux の場合)

See: here for details

os::interrupt() (Solaris の場合)

See: here for details

os::interrupt() (Windows の場合)

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.