线程状态的实质
当我们说一个线程的状态时,说的是什么?
就是一个变量的值而已。
哪个变量?
Thread 类中的一个变量,叫 private volatile int threadStatus = 0;
这个值是个整数,不方便理解,可以通过映射关系(VM.toThreadState),转换成一个枚举类。
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
所以,我们就盯着 threadStatus 这个值的变化就好了。
NEW
现在我们还没有任何 Thread 类的对象呢,也就不存在线程状态一说。
一切的起点,要从把一个 Thread 类的对象创建出来,开始说起。
Thread t = new Thread();
当然,你后面可以接很多参数。
Thread t = new Thread(r, "name1");
你也可以 new 一个继承了 Thread 类的子类。
Thread t = new MyThread();
你说线程池怎么不 new 就可以有线程了呢?内部也是 new 出来的。
public class Executors {
static class DefaultThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
Thread t = new Thread(...);
...
return t;
}
}
}
总是,一切的开始,都要调用 Thread 类的构造方法。
而这个构造方法,最终都会调用 Thread 类的 init() 方法。
private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inheritThreadLocals) {
...
this.grout = g;
this.name = name;
...
tid = nextThreadID();
}
这个 init 方法,仅仅是给该 Thread 类的对象中的属性,附上值,除此之外啥也没干。
它没有给 theadStatus 再次赋值,所以它的值仍然是其默认值。
而这个值对应的状态,就是 STATE.NEW,非要翻译成中文,就叫初始态吧。
因此说了这么多,其实就分析出新建一个 Thread 类的对象,就是创建了一个新的线程,此时这个线程的状态,是 NEW(初始态)。
之后的分析,将弱化 threadStatus 这个整数值了,就直接说改变了其线程状态,大家知道其实就只是改变了 threadStatus 的值而已。
RUNNABLE
刚刚处于 NEW 状态的线程,对应操作系统里的什么状态呢?
Thread t = new Thread();
在 Java 语言层面将自己的一个对象中的属性附上值罢了,根本没碰到操作系统级别的东西呢。
所以这个 NEW 状态,不论往深了说还是往浅了说,还真就只是个无聊的枚举值而已。
下面,精彩的故事才刚刚开始。
躺在堆内存中无所事事的 Thread 对象,在调用了 start() 方法后,才显现生机。
t.start();
这个方法一调用,会调用到 native 方法里。
看来改变状态就并不是一句 threadStatus = xxx 这么简单了,而是有本地方法对其进行了修改。