java.lang.Thread-threadStatus来自哪里?

时间:2018-11-21 06:00:09

标签: java

通过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的更改进行回调。

2 个答案:

答案 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;
    }
}
相关问题