首页 > 其他分享 >线程的 6 个状态(生命周期)

线程的 6 个状态(生命周期)

时间:2023-05-27 21:56:00浏览次数:51  
标签:状态 生命周期 Thread System Waiting 线程 out

线程的 6 个状态(生命周期)


1. 线程的一生中有哪几个状态

有6种状态,分别如下:

  • New
  • Runnable
  • Blocked
  • Waiting
  • Timed_Waiting
  • Terminated

2. 每个状态的含义是什么

New:是在 new Thread() 之后,执行 start() 方法之前的一个状态;

Runnable:是在线程调用 start() 方法之后的状态(其实包括两个阶段:一是 start() 方法调用之后但是未拿到 cpu 资源的 ready 阶段,二是拿到cpu资源的后的 Running 阶段);

Blocked:进入到 synchronized 修饰的相关方法或者代码块,但是没有拿到锁;等拿到 monitor 锁之后会重新进入 Runnable 状态;

Waiting:执行了 wait() 等方法后进入的一个状态,可见下图;

Timed_Waiting:执行了带有 time 参数的 wait(time) 方法后的状态,见下图;

Terminated:线程运行的最终状态:可能是run() 方法的逻辑运行结束,也有可能是遇到未被 catch 的异常,抛出异常后终止。

六种状态的含义和相互转换

上图展示了六种状态的含义和相互转换。

3. 代码展示六种状态

(1)展示线程的NEW、RUNNABLE、Terminated状态

/**
 * 描述:     展示线程的NEW、RUNNABLE、Terminated状态。即使是正在运行,也是Runnable状态,而不是Running。
 */
public class NewRunnableTerminated implements Runnable {

    public static void main(String[] args) {
        Thread thread = new Thread(new NewRunnableTerminated());
        //打印出NEW的状态
        System.out.println(thread.getState());
        thread.start();
        // 打印出 RUNNABLE 的状态,执行完 start() 方法就是 RUNNABLE,即使它可能还没有拿到cpu,开始真正的运行
        System.out.println(thread.getState());
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出RUNNABLE的状态,即使是正在运行,也是RUNNABLE,而不是RUNNING
        System.out.println(thread.getState());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出TERMINATED状态
        System.out.println(thread.getState());
    }

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
    }
}

打印结果:

NEW
RUNNABLE
0
1
2
3
... 中间的省略掉
710
711
RUNNABLE
712
713
714
715
716
... 中间的省略掉
998
999
TERMINATED

(2) 展示Blocked, Waiting, TimedWaiting

/**
 * 描述:     展示Blocked, Waiting, TimedWaiting
 */
public class BlockedWaitingTimedWaiting implements Runnable{
    public static void main(String[] args) {
        BlockedWaitingTimedWaiting runnable = new BlockedWaitingTimedWaiting();
        Thread thread1 = new Thread(runnable);
        thread1.start();
        Thread thread2 = new Thread(runnable);
        thread2.start();
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出Timed_Waiting状态,因为正在执行Thread.sleep(1000);
        System.out.println(thread1.getState());
        //打印出BLOCKED状态,因为thread2想拿得到sync()的锁却拿不到
        System.out.println(thread2.getState());
        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出WAITING状态,因为执行了wait()
        System.out.println(thread1.getState());

    }

    @Override
    public void run() {
        syn();
    }

    private synchronized void syn() {
        try {
            Thread.sleep(1000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

打印结果:

阻塞状态:

一般习惯而言,Blocked(被阻塞),Waiting(等待)、Timed_waiting(计时等待)都被称为阻塞状态。因为他们都需要被线程以外的条件去唤醒,不是当前线程所控制的。

文章来源:线程的 6 个状态(生命周期)

个人微信:CaiBaoDeCai

微信公众号名称:Java知者

微信公众号 ID: JavaZhiZhe

谢谢关注!

标签:状态,生命周期,Thread,System,Waiting,线程,out
From: https://www.cnblogs.com/javazhizhe/p/17437439.html

相关文章

  • 操作系统(2.8)--线程的实现
    线程的实现方式1.内核支持线程(KST)内核支持线程,与进程相同,是在内核的支持下运行的,即无论是用户进程中的线程,还是系统进程中的线程,他们的创建、撤消和切换等也是依靠内核,在内核空间实现的。这种线程实现方式主要有如下四个优点:(1)在多处理器系统中,内核能够同时调度同一进程中多个线......
  • jmeter线程组之间数据共享
    jmeter添加环境变量,可使跨线程组访问该属性值,实现了数据共享使用函数setProperties实现思路:先创建两个线程组,第一个线程组设置环境变量,第二个线程组获取环境变量的值(1)第一个线程组:设置随机生成四位数字后,在将值赋值给环境变量将设置的变量${param}引用到环境变量,在添加......
  • HTTP状态码是什么?常用的状态码有什么?
    HTTP(HypertextTransferProtocol)是一种用于传输超文本和其他内容的应用层协议。历史:HTTP最早的版本是HTTP/0.9,它只支持简单的GET请求,而不支持其他操作。HTTP/1.0版本增加了许多新特性,如支持多个请求,请求和响应头信息,以及管道化传输。HTTP/1.1版本是当前最常用的版本,它引入了持......
  • HTTP状态码是什么?常用的状态码有什么?
    HTTP(HypertextTransferProtocol)是一种用于传输超文本和其他内容的应用层协议。历史:HTTP最早的版本是HTTP/0.9,它只支持简单的GET请求,而不支持其他操作。HTTP/1.0版本增加了许多新特性,如支持多个请求,请求和响应头信息,以及管道化传输。HTTP/1.1版本是当前最常用的版本,它引入了持......
  • HTTP状态码是什么?常用的状态码有什么?
    HTTP(HypertextTransferProtocol)是一种用于传输超文本和其他内容的应用层协议。历史:HTTP最早的版本是HTTP/0.9,它只支持简单的GET请求,而不支持其他操作。HTTP/1.0版本增加了许多新特性,如支持多个请求,请求和响应头信息,以及管道化传输。HTTP/1.1版本是当前最常用的版本,它引入了持......
  • 广度优先搜索+状态压缩
    1.滑动谜题2.转化为全零矩阵的最少反转次数3.推箱子......
  • 【㉿Java并发】对象有状态 & 无状态
    有状态就是有数据存储功能。有状态对象(StatefulBean),就是有变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。实例变量和类变量都是状态变量无状态就是一次操作,不能保存数据。无状态对象(StatelessBean),就是没有实例 变量的对象.不能保存数据,是不......
  • x86游戏逆向之实战游戏线程发包与普通发包的逆向
    网游找Call的过程中难免会遇到不方便通过数据来找的或者仅仅查找数据根本找不到的东西,但是网游中一般的工程肯定要发给服务器,比如你打怪,如果都是在本地处理的话就特别容易产生变态功能,而且不方便与其他玩家通信,所以找到了游戏发包的地方,再找功能就易如反掌了。 在游戏逆向过程......
  • C++多线程
    多线程:thread_local每个线程都会有自己的一份数据,不会共享数据,避免竞争 volatile告诉编译器每次取数据都要从内存里取 使用情况:信号处理内存映射相关非本地跳转 std::atomic定义操作为原子操作,不可被线程分开 接口  std::shreadC++的线程类,但是不保证......
  • Thread Exercises C语言线程
    1/4Assignment4:ThreadsDue11Junby23:59Points10Availableuntil15Junat23:59Assignment4-ThreadExercisesDuedate11:59pm-SundayWeek13.Thisassignmentisdesignedtotestyourunderstandingofthreads,mutexesandsignalling.Download......