前言
JDK版本:1.8
阅读了Object的源码,wait和notify方法与线程联系紧密,而且多线程已经是必备知识,那保持习惯,就从多线程的源头Thread类开始读起吧。由于该类比较长,只读重要部分
源码
类声明和重要属性
package java.lang;
public class Thread implements Runnable {
private volatile String name;
// 优先级
private int priority;
//是否后台
private boolean daemon = false;
/* JVM state */
private boolean stillborn = false;
// 要跑的任务
private Runnable target;
// 线程组
private ThreadGroup group;
// 上下文加载器
private ClassLoader contextClassLoader;
// 权限控制上下文
private AccessControlContext inheritedAccessControlContext;
// 线程默认名字“Thread-{ { threadInitNumber }}”
private static int threadInitNumber;
// 线程本地局部变量,每个线程拥有各自独立的副本
ThreadLocal.ThreadLocalMap threadLocals = null;
// 有时候线程本地局部变量需要被子线程继承
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
// 线程初始化时申请的JVM栈大小
private long stackSize;
// 线程ID
private long tid;
// 线程init之后的ID
private static long threadSeqNumber;
// 0就是线程还处于NEW状态,没start
private volatile int threadStatus = 0;
// 给LockSupport.park用的需要竞争的对象
volatile Object parkBlocker;
// 给中断用的需要竞争的对象
private volatile Interruptible blocker;
// 线程最小优先级
public final static int MIN_PRIORITY = 1;
// 线程默认优先级
public final static int NORM_PRIORITY = 5;
// 线程最大优先级
public final static int MAX_PRIORITY = 10;
Java线程有几种状态?
// Thread类中的枚举
public enum State {
// 线程刚创建出来还没start
NEW,
// 线程在JVM中运行了,需要去竞争资源,例如CPU
RUNNABLE,
// 线程等待获取对象监视器锁,损被别人拿着就阻塞
BLOCKED,
// 线程进入等待池了,等待觉醒
WAITING,
// 指定了超时时间
TIMED_WAITING,
// 线程终止
TERMINATED;
}
下面这个图可以帮助理解Java线程的生命周期,这个图要会画!面试中被问到,当时画的很不专业,难受!
创建
那么线程如何进入初始New状态呢?让我们来看看构造,头皮发麻,怎么有七八个构造,这里只贴了一个
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
还好都是调用init()方法,怕怕的点开了
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) {
if (name == null) {
throw new NullPointerExcept