threadStatus变量的更改情况
来源:4-2 start方法

窝兔与草
2019-09-03
老师,调用start方法会去判断threadStatus是否等于0,我去看了一下源码,发现没有地方是去更改这个变量的状态的。请问这个变量的值是在哪个地方更改的呢
写回答
1回答
-
这个变量不是在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改变的具体实现方式。
812019-09-03
相似问题