threadStatus变量的更改情况

来源:4-2 start方法

窝兔与草

2019-09-03

老师,调用start方法会去判断threadStatus是否等于0,我去看了一下源码,发现没有地方是去更改这个变量的状态的。请问这个变量的值是在哪个地方更改的呢

写回答

1回答

悟空

2019-09-03

这个变量不是在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改变的具体实现方式。

8
1
窝兔与草
谢谢老师
2019-09-03
共1条回复

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

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

2512 学习 · 939 问题

查看课程