线程6种状态
Java 语言中线程共有六种状态,分别是:
1. NEW:初始化状态;
2. RUNNABLE:可运行 / 运行状态;
3. BLOCKED:阻塞状态;
4. WAITING:无时限等待;
5. TIMED_WAITING:有时限等待;
6. TERMINATED:终止状态;
NEW初始化状态
使用new Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。
比如:
// 自定义线程对象
class MyThread extends Thread {
public void run() {
// 线程需要执行的代码
......
}
}
// 创建线程对象
MyThread myThread = new MyThread();
如下图红色部分所示:
RUNNABLE状态
当线程被调用了 start(),且处于等待操作系统分配资源,比如: CPU、等待 IO 连接。
Thread thread = new Thread("thread"); thread.start();
可运行状态(runnable):又可以细分成两种状态,ready和running,分别表示就绪状态和运行状态。
如下图红色部分所示:
- 就绪状态:线程对象调用start方法之后,等待JVM的调度(此时该线程并没有运行),还未开始运行。
- 运行状态:线程对象已获得JVM调度,处在运行中,如果存在多个CPU,那么允许多个线程并行运行。
BLOCKED阻塞状态
从 Runnable 状态进入 Blocked 状态只有一种可能,就是进入 Synchronized 保护的代码时没有抢到 Monitor 锁。
如下图红色部分所示:
进入Synchronized保护的代码没有抢到锁,就进入阻塞状态。
当处于阻塞的线程重新获取到锁,就会从阻塞状态重新进入到就绪Runnable 状态。
WAITING无限等待
当线程调用 wait()、join()、LockSupport.park()方法之后就会出现Waiting无条件等待状态。
备注:调用了wait方法,这里是无参数的wait方法。
比如:
Thread thread1 = new Thread("thread1") { @Override public void run() { synchronized (WaitingState1.class) { try { //调用wait方法,让线程等待 WaitingState1.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }; thread1.start(); //模拟休眠1秒,让thread1运行到wait方法处 TimeUnit.SECONDS.sleep(1);
该线程进入等待状态,如下图左侧红色部分所示:
处于该状态中的线程只能被其他线程唤醒。
TIMED_WAITING有限等待
当线程调用 sleep(睡眠时间)/wait(等待时间)/join(等待时间)/ LockSupport.parkNanos(等待时间)/LockSupport.parkUntil(等待时间)方法之后,就会进入TIMED_WAITING有限等待状态。
如下图所示:
备注:这里调用的带参数的wait方法,WAITING状态调用的无参数wait方法。
TERMINATED终止状态
也可以称为死亡状态,正常执行完run方法而退出,表示线程终止,它的生命走到了尽头。
如下图所示:
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》