1.线程的五种状态
线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中,它总共包含以下 6
个状态:
- NEW,新建状态,线程被创建出来,但尚未启动时的线程状态;
-** RUNNABLE**,就绪状态,表示可以运行的线程状态,它可能正在运行,或者是在排队等待操作系统给它分配
CPU 资源;
-
BLOCKED,阻塞等待锁的线程状态,表示处于阻塞状态的线程正在等待监视器锁,比如等待执行
synchronized 代码块或者使用 synchronized 标记的方法; -
WAITING,等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作,比如,一个线程调用了
Object.wait() 方法,那它就在等待另一个线程调用 Object.notify() 或
Object.notifyAll() 方法; -
TIMED_WAITING,计时等待状态,和等待状态(WAITING)类似,它只是多了超时时间,比如调用了有超时时间设置的方法
Object.wait(long timeout) 和 Thread.join(long timeout)
等这些方法时,它才会进入此状态; -
TERMINATED,终止状态,表示线程已经执行完成。
线程状态的源代码如下:
public enum State {
/**
* 新建状态,线程被创建出来,但尚未启动时的线程状态
*/
NEW,
/**
* 就绪状态,表示可以运行的线程状态,但它在排队等待来自操作系统的 CPU 资源
*/
RUNNABLE,
/**
* 阻塞等待锁的线程状态,表示正在处于阻塞状态的线程
* 正在等待监视器锁,比如等待执行 synchronized 代码块或者
* 使用 synchronized 标记的方法
*/
BLOCKED,
/**
* 等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作。
* 例如,一个线程调用了 Object.wait() 它在等待另一个线程调用
* Object.notify() 或 Object.notifyAll()
*/
WAITING,
/**
* 计时等待状态,和等待状态 (WAITING) 类似,只是多了超时时间,比如
* 调用了有超时时间设置的方法 Object.wait(long timeout) 和
* Thread.join(long timeout) 就会进入此状态
*/
TIMED_WAITING,
/**
* 终止状态,表示线程已经执行完成
*/
}
线程的工作模式是,首先先要创建线程并指定线程需要执行的业务方法,然后再调用线程的
start() 方法,此时线程就从 NEW(新建)状态变成了
RUNNABLE(就绪)状态,此时线程会判断要执行的方法中有没有 synchronized
同步代码块,如果有并且其他线程也在使用此锁,那么线程就会变为
BLOCKED(阻塞等待)状态,当其他线程使用完此锁之后,线程会继续执行剩余的方法。
当遇到 Object.wait() 或 Thread.join() 方法时,线程会变为
WAITING(等待状态)状态,如果是带了超时时间的等待方法,那么线程会进入
TIMED_WAITING(计时等待)状态,当有其他线程执行了 notify() 或notifyAll()
方法之后,线程被唤醒继续执行剩余的业务方法,直到方法执行完成为止,此时整个线程的流程就执行完了,执行流程如下图所示: