通过Java source code,我们拥有了
// variable not written or updated anywhere on this class
private volatile int threadStatus = 0;
public State getState() {
// get current thread state
return sun.misc.VM.toThreadState(threadStatus);
}
threadStatus
的更新方式和位置?
想法是最终尝试用AOP编织更新方法,并对threadStatus
的更改进行回调。
答案 0 :(得分:6)
在文件hotspot/src/share/vm/classfile/javaClasses.cpp
中的OpenJDK源代码中,您可以看到以下代码:
// Write the thread status value to threadStatus field in java.lang.Thread java class.
void java_lang_Thread::set_thread_status(oop java_thread,
java_lang_Thread::ThreadStatus status) {
// The threadStatus is only present starting in 1.5
if (_thread_status_offset > 0) {
java_thread->int_field_put(_thread_status_offset, status);
}
}
状态似乎是在本机代码中管理的。这意味着您无法从Java代码中拦截其更改。
答案 1 :(得分:1)
这是内部线程状态,应将https://s.abcnews.com/images/WNT/181119_wn_whitworth_hpMain_16x9_992.jpg反映为NEW,RUNNABLE等。
我发现了一个Netbeans Thread State,它暗示toThreadState()
是/可以在JDK代码之外实现:
bugfix#262633,toThreadState()在本地实现,不依赖JDK
因此也可以修改未在Java代码中更新的threadStatus
,注意0
的值代表issue:
/** taken from sun.misc.VM * * Returns Thread.State for the given threadStatus */ private static Thread.State toThreadState(int threadStatus) { if ((threadStatus & JVMTI_THREAD_STATE_RUNNABLE) != 0) { return State.RUNNABLE; } else if ((threadStatus & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) { return State.BLOCKED; } else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_INDEFINITELY) != 0) { return State.WAITING; } else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) != 0) { return State.TIMED_WAITING; } else if ((threadStatus & JVMTI_THREAD_STATE_TERMINATED) != 0) { return State.TERMINATED; } else if ((threadStatus & JVMTI_THREAD_STATE_ALIVE) == 0) { return State.NEW; } else { return State.RUNNABLE; } }