我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java线程的6种状态与生命周期是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java线程的6种状态与生命周期是什么

本文小编为大家详细介绍“Java线程的6种状态与生命周期是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java线程的6种状态与生命周期是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    1.线程状态(生命周期)

    一个线程在给定的时间点只能处于一种状态。

    线程可以有如下6 种状态:

    • New (新创建):未启动的线程;

    • Runnable (可运行):可运行的线程,需要等待操作系统资源;

    • Blocked (被阻塞):等待监视器锁而被阻塞的线程;

    • Waiting (等待):等待唤醒状态,无限期地等待另一个线程唤醒;

    • Timed waiting (计时等待):在指定的等待时间内等待另一个线程执行操作的线程;

    • Terminated (被终止):已退出的线程。

    要确定一个线程的当前状态, 可调用getState 方法

    线程状态关系图

    注意:虚线框(全大写英文)的状态为Java线程状态。

    Java线程的6种状态与生命周期是什么

    2.操作线程状态

    2.1.新创建状态(NEW)

    就是实例化线程完成后,未启动线程的状态。

    可通过三种方式创建线程

    • 重写Thread类run()方法

    • 实现Runnable接口

    • 实现Callable接口

    一个简单的例子概括三种方式

    public class Demo {    public static void main(String[] args) throws ExecutionException, InterruptedException {                Thread thread = new Thread() {            @Override            public void run() {                System.out.println("Thread");            }        };        // 开启线程        thread.start();                Thread runThread = new Thread(() -> {            System.out.println("Runnable");        });        // 开启线程        runThread.start();                FutureTask<String> futureTask = new FutureTask<String>(() -> {            System.out.println("Callable");            return "CallableThread";        });        Thread callThread = new Thread(futureTask);        // 开启线程        callThread.start();        // 获取call()方法的返回值        String s = futureTask.get();        System.out.println("call()方法的返回值:"+s);    }}

    不重写 run() 或 call() 方法直接实例化Thread类创建的线程没有实际意义;

    只有Callable方式创建的线程可以获取线程的返回值。

    2.2.可运行状态(RUNNABLE)

    该状态指的是线程实例化对象调用start()方法后进入的状态。线程处于可以运行状态,如果有处理器等资源,就可以执行程序。

    该状态在操作系统层面包含两步:线程就绪和线程运行中,但在Java线程状态中,这两步都统称为Runnable(可运行)状态。

    线程由就绪状态变为运行状态,重点就看你的线程有没有抢到CPU资源(CPU时间片),谁抢到就运行,没抢到就等。因为CPU时间片(执行时间)非常短,大概十几毫秒,所以线程切换的这个时间是非常短的,就绪状态变为运行状态的时间也非常短,在开发时几乎感觉不到这种状态的变化,所以在Java中将两者看作是一个整体,重点关注线程可否运行并区别于其他状态即可,更进一步简化线程的开发。如果你的程序要运行很久(比如写个死循环),在一个CPU时间片内没有执行完成,那么你的线程就要抢下一次的CPU时间片,抢到了才可以继续执行程序,没抢到那就要继续抢,直到线程中的程序执行完成。

    其实这个场景应该都见到过,例如多个线程执行同一个程序,都将日志打印到同一个文件时,就会出现不同线程的日志混在了一起的情况,不利于排查问题。解决这种问题常见的方法有:一是分线程打印日志到不同文件;二是将日志信息保存到字符串对象中,在程序的最后将日志信息一次性打印到文件。第二种方式就是利用CPU的一个时间片来完成日志信息的打印。

    注意:程序只能对新建状态的线程调用start()方法,不要对处于非新建状态的线程调用start() 方法,这都会引发IllegalThreadStateException异常。

    2.3.被阻塞状态(BLOCKED)

    线程处于等待监视器而被阻塞的状态。有一个线程获取了锁未释放,其他线程也来获取,但发现获取不到锁也进入了被阻塞状态。

    被阻塞状态只存在于多线程并发访问下,区别于后面两种因线程自己进入”等待“而导致的阻塞。

    进入状态

    • 进入synchronized 代码块/方法

    • 未获取到锁

    退出状态

    • 获取到监视器锁

    2.4.等待唤醒状态(WAITING)

    整个流程是这样的:线程在某个对象的同步方法中先获取到对象锁;在执行wait方法时,该线程将释放对象锁,并且该线程被放入到这个对象的等待队列;等待另一个线程获取到同一个对象的锁,然后通过notify() 或 notifyAll() 方法唤醒对象等待队列中的线程。

    从整个流程可以知道

    wait (),notify () 和 notifyAll () 方法需要在线程获取到锁的情况下才可以继续执行,所以这三个方法都需要放在同步代码块/方法中执行,否则报异常:java.lang.IllegalMonitorStateException。

    在同步代码块中,线程进入WAITING 状态时,锁会被释放,不会导致该线程阻塞。反过来想下,如果锁没释放,那其他线程就没办法获取锁,也就没办法唤醒它。

    进入状态

    • object.wait()

    • thread.join()

    • LockSupport.park()

    退出状态

    • object.notify()

    • object.notifyall()

    • LockSupport.unpark()

    2.5.计时等待状态(TIMED_WAITING)

    一般是计时结束就会自动唤醒线程继续执行后面的程序,对于Object.wait(long) 方法还可以主动通知唤醒。

    注意:Thread类下的sleep() 方法可以放在任意地方执行;而wait(long) 方法和wait() 方法一样,需要放在同步代码块/方法中执行,否则报异常:java.lang.IllegalMonitorStateException。

    进入状态

    • Thread.sleep(long)

    • Object.wait(long)

    • Thread.join(long)

    • LockSupport.parkNanos(long)

    • LockSupport.parkNanos(Object blocker, long nanos)

    • LockSupport.parkUntil(long)

    • LockSupport.parkUntil(Object blocker, long deadline)

    注:blocker 参数为负责此线程驻留的同步对象。

    退出状态

    • 计时结束

    • LockSupport.unpark(Thread)

    • object.notify()

    • object.notifyall()

    2.6.终止(TERMINATED)

    线程执行结束

    • run()/call() 执行完成

    • stop()线程

    • 错误或异常>>意外死亡

    stop() 方法已弃用。

    3.查看线程的6种状态

    通过一个简单的例子来查看线程出现的6种状态。

    案例

    public class Demo3 {    private static Object object ="obj";        public static void main(String[] args) throws InterruptedException {        Thread thread0 = new Thread(() -> {            try {                // 被阻塞状态(BLOCKED)                synchronized (object){                    System.out.println("thread0 进入:等待唤醒状态(WAITING)");                    object.wait();                    System.out.println("thread0 被解除完成:等待唤醒状态(WAITING)");                }                System.out.println("thread0 "+Thread.currentThread().getState());            } catch (InterruptedException e) {                e.printStackTrace();            }        });        // 新创建状态(NEW)        System.out.println(thread0.getName()+":"+thread0.getState());        Thread thread1 = new Thread(() -> {            try {                System.out.println("thread1 进入:计时等待状态(TIMED_WAITING)");                Thread.sleep(2);                System.out.println("thread1 出来:计时等待状态(TIMED_WAITING)");            } catch (InterruptedException e) {                e.printStackTrace();            }            // 被阻塞状态(BLOCKED)            synchronized (object){                System.out.println("thread1 解除:等待唤醒状态(WAITING)");                object.notify();                System.out.println("thread1 解除完成:等待唤醒状态(WAITING)");            }            System.out.println("thread1 "+Thread.currentThread().getState());        });        // 新创建状态(NEW)        System.out.println(thread1.getName()+":"+thread1.getState());        printState(thread0);        printState(thread1);        // 可运行状态(RUNNABLE)        thread0.start();        // 可运行状态(RUNNABLE)        thread1.start();    }            // 使用独立线程来打印线程状态    private static void printState(Thread thread) {        new Thread(()->{            while (true){                System.out.println(thread.getName()+":"+thread.getState());                if (thread.getState().equals(Thread.State.TERMINATED)){                    System.out.println(thread.getName()+":"+thread.getState());                    break;                }            }        }).start();    }}

    执行结果:简化后的输出结果

    Thread-0:NEW
    Thread-1:NEW
    Thread-0:RUNNABLE
    Thread-1:RUNNABLE
    thread0 进入:等待唤醒状态(WAITING)
    Thread-1:BLOCKED
    thread1 进入:计时等待状态(TIMED_WAITING)
    Thread-0:BLOCKED
    Thread-0:WAITING
    &hellip;&hellip;
    Thread-0:WAITING
    Thread-1:BLOCKED
    Thread-1:TIMED_WAITING
    &hellip;&hellip;
    Thread-1:TIMED_WAITING
    Thread-1:BLOCKED
    &hellip;&hellip;
    Thread-1:BLOCKED
    Thread-0:WAITING
    &hellip;&hellip;
    Thread-0:WAITING
    thread1 出来:计时等待状态(TIMED_WAITING)
    Thread-0:WAITING
    Thread-1:BLOCKED
    thread1 解除:等待唤醒状态(WAITING)
    Thread-1:BLOCKED
    Thread-0:WAITING
    Thread-0:BLOCKED
    thread1 解除完成:等待唤醒状态(WAITING)
    Thread-1:BLOCKED
    thread1 RUNNABLE
    Thread-0:BLOCKED
    Thread-1:TERMINATED
    thread0 被解除完成:等待唤醒状态(WAITING)
    Thread-0:BLOCKED
    thread0 RUNNABLE
    Thread-0:TERMINATED

    Java线程的6种状态与生命周期是什么

    最终的执行结果如图。

    注意:因为案例中使用了独立线程来打印不同线程的状态,会出现状态打印稍微延迟的情况。

    读到这里,这篇“Java线程的6种状态与生命周期是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java线程的6种状态与生命周期是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Java线程的6种状态与生命周期是什么

    本文小编为大家详细介绍“Java线程的6种状态与生命周期是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java线程的6种状态与生命周期是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.线程状态(生命
    2023-06-30

    java线程生命周期的状态有哪几种

    Java线程的生命周期有以下几种状态:1. 新建(New):当线程对象被创建时,该线程处于新建状态。2. 就绪(Runnable):当线程对象调用 `start()` 方法后,该线程处于就绪状态,等待获取CPU时间片执行。3. 运行(Run
    2023-09-11

    java线程生命周期哪些状态

    Java线程生命周期有以下几个状态:1. 新建状态(New):线程被创建但还未开始执行。2. 就绪状态(Runnable):线程已经被创建并且可以开始执行,但还未被调度执行。3. 运行状态(Running):线程正在执行任务。4. 阻塞状态
    2023-08-26

    java中线程的完整生命周期有哪几种状态

    Thread.State类Thread.State类定义了线程的几种状态,在一个完整的生命周期中通常要经历五种状态:新建: 当一个Thread类或其子类的对象被声明并创建时;就绪: start()方法后,将进入线程队列等待CPU时间片;运行: 当就绪的线程被调
    java中线程的完整生命周期有哪几种状态
    2016-02-24

    Java中线程的生命周期是什么

    这篇文章主要介绍“ Java中线程的生命周期是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ Java中线程的生命周期是什么”文章能帮助大家解决问题。操作系统中线程的生命周期操作系统的线程生命周
    2023-06-16

    Java中的线程生命周期核心概念是什么

    本篇内容主要讲解“Java中的线程生命周期核心概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的线程生命周期核心概念是什么”吧!Java多线程在Java语言中,多线程是由线程的
    2023-07-02

    java线程的几种状态是什么

    Java线程既可以创建,也可以销毁,所以线程是有生命周期的,而线程的生命周期就可以用线程的六种状态来描述。从Thread类的源码中可以看出线程一共有6种状态:这六种状态分别是:1. New:初始状态,线程被创建,没有调用start()。2. Runnable:
    java线程的几种状态是什么
    2019-04-18

    Java线程生命周期的终止与复位怎么实现

    这篇文章主要介绍“Java线程生命周期的终止与复位怎么实现”,在日常操作中,相信很多人在Java线程生命周期的终止与复位怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程生命周期的终止与复位怎
    2023-07-02

    Java的线程状态是什么

    这篇文章主要介绍“Java的线程状态是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java的线程状态是什么”文章能帮助大家解决问题。Java的每个线程都具有自己的状态,Thread类中成员变量
    2023-07-04

    请描述Java中的线程生命周期及状态转换。(Java线程从创建到销毁的整个过程是怎样的?其状态是如何转换的?)

    Java线程生命周期包括新建、就绪、运行、阻塞、等待和终止状态。状态转换由事件触发,如启动、阻塞操作、等待和唤醒。开发者可使用start、join、sleep、wait和notify/notifyAll方法管理线程状态。了解生命周期和转换对于避免多线程问题至关重要。
    请描述Java中的线程生命周期及状态转换。(Java线程从创建到销毁的整个过程是怎样的?其状态是如何转换的?)
    2024-04-02

    Android Activity的生命周期与加载模式是什么

    这篇文章主要介绍了Android Activity的生命周期与加载模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android Activity的生命周期与加载模式是什么文章都会有所收获,下面我们一起
    2023-07-05

    C++变量的作用域与生命周期是什么

    今天小编给大家分享一下C++变量的作用域与生命周期是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、变量的作用域变量的
    2023-07-05

    Spring中Bean的作用域与生命周期是什么

    这篇文章主要讲解了“Spring中Bean的作用域与生命周期是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中Bean的作用域与生命周期是什么”吧!一、Bean的作用域通过S
    2023-06-22

    Spring的Bean初始化过程和生命周期是什么

    本篇内容介绍了“Spring的Bean初始化过程和生命周期是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Spring创建bean的
    2023-07-05

    Java中线程状态+线程安全问题+synchronized的用法是什么

    这篇文章主要介绍了Java中线程状态+线程安全问题+synchronized的用法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中线程状态+线程安全问题+synchronized的用法是什么文章都
    2023-06-29

    Java多线程中消费者与生产者的关系是什么

    这篇文章将为大家详细讲解有关Java多线程中消费者与生产者的关系是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  多线程:CPU中各种任务在交替执行过程中,被称为多线程处理。其中,每个任务的一次动态
    2023-06-02

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录