进入后面章节学习之前,我们继续了解线程相关概念。
线程状态说明及对应枚举类
线程的六种状态:
- NEW:新建状态,线程初始化完成后处于此状态 Thread thread = new Thread()
- RUNNABLE: Thread实例被调用start方法后,线程进入CPU就绪队列,随时被调度。
- BLOCKED:阻塞状态,此状态的线程正在等待synchronized同步监视器锁。
- WAITING:非超时等待,也是阻塞的一种状态。
- TIMED_WAITING:超时等待,也是阻塞的一种状态。
- TERMINATED:终止状态,线程正常结束或异常退出后的状态。
java.lang.Thread.State
public enum State {
/**
* 新建状态 Thread thread = new Thread()
*/
NEW,
/**
* 就绪状态,也叫做“可执行状态”。由当前线程调用thread的start()启动线程
* 此时thread线程处于就绪状态,进入就绪队列等待CPU调度执行
*/
RUNNABLE,
/**
* 阻塞状态,同步阻塞
*/
BLOCKED,
/**
* 等待状态,此状态为无限期非超时等待,实际上也是等待阻塞
* Object.wait 、Thread.join、LockSupport.park
*/
WAITING,
/**
* 超时等待状态
*/
TIMED_WAITING,
/**
* 终止状态:线程正常结束或是异常退出
*/
TERMINATED;
}
了解Thread的部分属性
java.lang.Thread
//线程名
private volatile String name;
//线程优先级
private int priority;
/* 守护线程标识 */
private boolean daemon = false;
/* 线程调度执行的目标对象,通过实现Runnable方式创建线程时赋值 */
private Runnable target;
/* 线程组,即每个线程都有自己所属的组。所有的线程、线程组都归属system线程组 */
private ThreadGroup group;
/* 线程名编号 Thread-1 */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
/* ThreadLocal 线程本地变量 */
ThreadLocal.ThreadLocalMap threadLocals = null;
/*
* InheritableThreadLocal 可被子线程继承本地变量
*/
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
/*
* 线程堆栈大小
*/
private long stackSize;
/*
* Thread ID
*/
private long tid;
/* For generating thread ID */
private static long threadSeqNumber;
/*
* 线程初始状态
*/
private volatile int threadStatus = 0;
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
/**
* 最低优先级
*/
public final static int MIN_PRIORITY = 1;
/**
* 默认优先级
*/
public final static int NORM_PRIORITY = 5;
/**
* 最大优先级
*/
public final static int MAX_PRIORITY = 10;
常用属性
很多时候我们可能会设置name、daemon、target、线程本地变量ThreadLocal,线程状态的设置通常是有jvm完成的。
线程状态操作涉及内容
synchronized关键字:用于获取对象监视器同步锁,用法有同步方法、同步块两种。
Object:wait()、notify()、notifyAll()
LockSupport:park()、unpark(Thread thread)
Thread: interrupt()、join()、sleep(long millis)
后续章节逐一分析介绍。