threadStatus的值是在哪里更新的呢?

来源:4-5 本章常见问题

woy

2019-12-04

我想问下, start方法中首先判断threadStatus这个状态值, 那这个start方法执行后应该更新该值啊, 是怎么更新的呢?

写回答

1回答

悟空

2019-12-04

这个变量不是在Java代码层做修改的,是JVM修改的,比如Thread类的 start0() 是一个 native 修饰的方法,所以这是调用了底层 C/C++,JVM 内部控制了threadState 变量。

在获取线程状态的时候,也用到了threadStatus变量:


public State getState() {    // get current thread state
    return sun.misc.VM.toThreadState(threadStatus);
}

   

再看threadStatus的定义:private volatile int threadStatus = 0;// 这是内存可见的,就是要保证C++可见,而且Java也可以拿到该值。


在OpenJDK文件中的源代码中,hotspot/src/share/vm/classfile/javaClasses.cpp,你可以看到以下代码:

   

// 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);
  }}

   

threadStatus的状态修改由底层的C++代码实现,而threadStatus的状态值变化对JVM是可见的,但是在Java里无法看到threadStatus改变的具体实现方式。


1
3
悟空
回复
woy
这个我不确定,我猜测是可能是因为需要同时改变线程在操作系统里的状态(操作系统里线程状态和java中的不完全一样),所以要native
2019-12-05
共3条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程