图解线程状态

线程状态的实质

当我们说一个线程的状态时,说的是什么?

就是一个变量的值而已。

哪个变量?

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 这么简单了,而是有本地方法对其进行了修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值