Repository navigation
jdk thread
wangkaiwu edited this page Apr 1, 2022
·
2 revisions
JVM_QUICK_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
JVMWrapper("JVM_IsInterrupted");
ThreadsListHandle tlh(thread);
JavaThread* receiver = NULL;
// 將 jthread 转化为 jvm 的 JavaThread。并返回线程是否活跃
bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
if (is_alive) {
// jthread refers to a live JavaThread.
return (jboolean) Thread::is_interrupted(receiver, clear_interrupted != 0);
} else {
// 不活跃也认为没有被打断
return JNI_FALSE;
}
JVM_ENDbool Thread::is_interrupted(Thread* thread, bool clear_interrupted) {
return os::is_interrupted(thread, clear_interrupted);
}bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
OSThread* osthread = thread->osthread();
bool interrupted = osthread->interrupted();
if (interrupted && clear_interrupted) {
osthread->set_interrupted(false);
}
return interrupted;
}JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
JVMWrapper("JVM_Interrupt");
ThreadsListHandle tlh(thread);
JavaThread* receiver = NULL;
bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
if (is_alive) {
// jthread refers to a live JavaThread.
Thread::interrupt(receiver);
}
JVM_ENDvoid os::interrupt(Thread* thread) {
OSThread* osthread = thread->osthread();
if (!osthread->interrupted()) {
// 如果还没有被打断,则设置为打断
osthread->set_interrupted(true);
// 双屏障
OrderAccess::fence();
// 先把 _SleepEvent 唤醒
ParkEvent *const slp = thread->_SleepEvent;
if (slp != NULL) slp->unpark();
}
if (thread->is_Java_thread())
// 再把 parker 唤醒,也就是 park() 对应的方法
((JavaThread *) thread)->parker()->unpark();
ParkEvent *ev = thread->_ParkEvent;
// 最后是 _ParkEvent
if (ev != NULL) ev->unpark();
}