线程状态超详解(6种线程状态图解)

线程状态超详解(6种线程状态图解)-mikechen

线程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();

如下图红色部分所示:

线程状态超详解(6种线程状态图解)-mikechen

 

RUNNABLE状态

当线程被调用了 start(),且处于等待操作系统分配资源,比如: CPU、等待 IO 连接。

Thread thread = new Thread("thread");
thread.start();

可运行状态(runnable):又可以细分成两种状态,ready和running,分别表示就绪状态和运行状态

如下图红色部分所示:

线程状态超详解(6种线程状态图解)-mikechen

  • 就绪状态:线程对象调用start方法之后,等待JVM的调度(此时该线程并没有运行),还未开始运行。
  • 运行状态:线程对象已获得JVM调度,处在运行中,如果存在多个CPU,那么允许多个线程并行运行。

 

BLOCKED阻塞状态

从 Runnable 状态进入 Blocked 状态只有一种可能,就是进入 Synchronized 保护的代码时没有抢到 Monitor 锁。

如下图红色部分所示:

线程状态超详解(6种线程状态图解)-mikechen

进入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);

该线程进入等待状态,如下图左侧红色部分所示:

线程状态超详解(6种线程状态图解)-mikechen

处于该状态中的线程只能被其他线程唤醒。

 

TIMED_WAITING有限等待

当线程调用 sleep(睡眠时间)/wait(等待时间)/join(等待时间)/ LockSupport.parkNanos(等待时间)/LockSupport.parkUntil(等待时间)方法之后,就会进入TIMED_WAITING有限等待状态。

如下图所示:

 

线程状态超详解(6种线程状态图解)-mikechen

备注:这里调用的带参数的wait方法,WAITING状态调用的无参数wait方法。

 

TERMINATED终止状态

也可以称为死亡状态,正常执行完run方法而退出,表示线程终止,它的生命走到了尽头。

如下图所示:

线程状态超详解(6种线程状态图解)-mikechen

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法