广告
返回顶部
首页 > 资讯 > 精选 >Java中的线程生命周期核心概念是什么
  • 628
分享到

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

2023-07-02 08:07:04 628人浏览 薄情痞子
摘要

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

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

Java多线程

在Java语言中,多线程是由线程的核心概念驱动的。线程在其生命周期中会经历各种状态:

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

Java中线程的生命周期

java.lang.Thread类包含一个静态枚举,它定义了它的潜在状态。在任何给定的时间点内,线程只能处于以下状态之一:

  • NEW – 一个新创建的线程,尚未开始执行

  • RUNNABLE – 正在运行或准备执行,但它正在等待资源分配

  • BLOCKED – 等待获取监视器以进入或重新进入同步块/方法

  • WAITING – 等待其他线程执行特定操作,无任何时间限制

  • TIMED_WAITING – 等待其他线程在指定时间段内执行特定操作

  • TERMINATED – 已完成执行

上图涵盖了所有这些状态;现在让我们详细讨论其中的每一项。

NEW

新线程(或出生线程)是已创建但尚未启动的线程。在我们使用start()方法启动它之前,它一直保持此状态。

以下代码段显示了新创建的处于新状态的线程:

Runnable runnable = new NewState();Thread t = new Thread(runnable);Log.info(t.getState());

由于我们尚未启动上述线程,因此方法t.getState()会打印:

NEW

Runnable

当我们创建了一个新线程并对其调用start()方法时,它将从NEW状态移动到RUNNABLE状态。处于此状态的线程正在运行或准备运行,但它们正在等待来自系统的资源分配。

在多线程环境中,线程调度程序(JVM的一部分)为每个线程分配固定的时间量。因此,它会运行一段特定的时间,然后将控制权交给其他可运行的线程。

例如,让我们将t.start()方法添加到前面的代码中,并尝试访问其当前状态:

Runnable runnable = new NewState();Thread t = new Thread(runnable);t.start();Log.info(t.getState());

此代码很可能返回以下输出:

RUNNABLE

请注意:在本例中,并不总是保证在控件到达t.getState()时,它仍处于可运行状态。

线程调度器可能会立即对其进行调度,并可能完成执行。在这种情况下,我们可能会得到不同的输出。

Blocked

当前没有资格运行的线程处于阻塞状态。它在等待监视器锁定并尝试访问被其他线程锁定的代码段时进入此状态。

让我们尝试重现这种状态:

public class BlockedState {    public static void main(String[] args) throws InterruptedException {        Thread t1 = new Thread(new DemoThreadB());        Thread t2 = new Thread(new DemoThreadB());        t1.start();        t2.start();                Thread.sleep(1000);                Log.info(t2.getState());        System.exit(0);    }}class DemoThreadB implements Runnable {    @Override    public void run() {        commonResource();    }        public static synchronized void commonResource() {        while(true) {            // Infinite loop to mimic heavy processing            // 't1' won't leave this method            // when 't2' try to enter this        }    }}

在此代码中:

  • 我们创建了两个不同的线程—t1t2

  • t1启动并进入synchronized commonResource()方法;这意味着只有一个线程可以访问它;在当前线程完成处理之前,将阻止尝试访问此方法的所有其他后续线程进一步执行

  • t1进入此方法时,它将保持在无限while循环中;这只是为了模拟繁重的处理,以便所有其他线程都无法进入此方法

  • 现在,当我们启动t2时,它尝试进入commonResource()方法,t1已经访问了该方法,因此t2将保持在阻塞状态

处于这种状态,我们称之为t2.getState()并获取输出,如下所示:

BLOCKED

Waiting

线程在等待其他线程执行特定操作时处于等待状态。

根据JavaDocs,任何线程都可以通过调用以下三种方法中的任何一种进入这种状态:

  • object.wait()

  • thread.join()

  • LockSupport.park()

请注意,在wait()join()中,我们没有定义任何超时时间,因为下一节将介绍该场景。

现在,让我们尝试重现这种状态:

public class WaitingState implements Runnable {    public static Thread t1;    public static void main(String[] args) {        t1 = new Thread(new WaitingState());        t1.start();    }    public void run() {        Thread t2 = new Thread(new DemoThreadWS());        t2.start();        try {            t2.join();        } catch (InterruptedException e) {            Thread.currentThread().interrupt();            Log.error("Thread interrupted", e);        }    }}class DemoThreadWS implements Runnable {    public void run() {        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            Thread.currentThread().interrupt();            Log.error("Thread interrupted", e);        }                Log.info(WaitingState.t1.getState());    }}

让我们讨论一下我们在这里做什么:

  • 我们已经创建并启动了t1

  • t1创建t2并启动它

  • t2的处理继续时,我们称之为t2.join(),这会使t1处于等待状态,直到t2完成执行

  • 因为t1正在等待t2完成,所以我们调用t1.getState()来自t2

正如您所期望的那样,这里的输出是:

WAITING

Timed Waiting

当线程等待另一个线程在规定的时间内执行特定操作时,该线程处于TIMED_WAITING状态。

根据JavaDocs,有五种方法可以将线程置于TIMED_WAITING状态:

  • thread.sleep(long millis)

  • wait(int timeout) 或 wait(int timeout, int nanos)

  • thread.join(long millis)

  • LockSupport.parkNanos

  • LockSupport.parkUntil

现在,让我们尝试快速重现这种状态:

public class TimedWaitingState {    public static void main(String[] args) throws InterruptedException {        DemoThread obj1 = new DemoThread();        Thread t1 = new Thread(obj1);        t1.start();                // The following sleep will give enough time for ThreadScheduler        // to start processing of thread t1        Thread.sleep(1000);        Log.info(t1.getState());    }}class DemoThread implements Runnable {    @Override    public void run() {        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            Thread.currentThread().interrupt();            Log.error("Thread interrupted", e);        }    }}

这里,我们创建并启动了一个线程t1,该线程进入睡眠状态,超时时间为5秒;

输出将为:

TIMED_WAITING

Terminated

这是死线程的状态。当它完成执行或异常终止时,它处于终止状态。

让我们在以下示例中尝试实现此状态:

public class TerminatedState implements Runnable {    public static void main(String[] args) throws InterruptedException {        Thread t1 = new Thread(new TerminatedState());        t1.start();        // The following sleep method will give enough time for         // thread t1 to complete        Thread.sleep(1000);        Log.info(t1.getState());    }        @Override    public void run() {        // No processing in this block    }}

在这里,虽然我们已经启动了线程t1,但它是下一个语句Thread.sleep(1000)为t1提供了足够的时间来完成,因此该程序为我们提供如下输出:

TERMINATED

除了线程状态之外,我们还可以检查isAlive()方法以确定线程是否处于活动状态。例如,如果我们在此线程上调用isAlive()方法:

Assert.assertFalse(t1.isAlive());

到此,相信大家对“Java中的线程生命周期核心概念是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java中的线程生命周期核心概念是什么

本文链接: https://www.lsjlt.com/news/340554.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java中的线程生命周期核心概念是什么
    本篇内容主要讲解“Java中的线程生命周期核心概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的线程生命周期核心概念是什么”吧!Java多线程在Java语言中,多线程是由线程的...
    99+
    2023-07-02
  • Java中的线程生命周期核心概念
    目录Java多线程Java中线程的生命周期NEWRunnableBlockedWaitingTimed WaitingTerminated结论前言: 在本文中,我们将详细讨论Java...
    99+
    2022-11-13
  • Java中线程的生命周期是什么
    这篇文章主要介绍“ Java中线程的生命周期是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ Java中线程的生命周期是什么”文章能帮助大家解决问题。操作系统中线程的生命周期操作系统的线程生命周...
    99+
    2023-06-16
  • java中的四个核心概念是什么
    本篇内容主要讲解“java中的四个核心概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中的四个核心概念是什么”吧!1.Java虚拟机Java虚拟机的主要任务是装在class文件并...
    99+
    2023-06-17
  • Java线程的6种状态与生命周期是什么
    本文小编为大家详细介绍“Java线程的6种状态与生命周期是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java线程的6种状态与生命周期是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.线程状态(生命...
    99+
    2023-06-30
  • vue中的生命周期是什么
    这篇文章给大家分享的是有关vue中的生命周期是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是生命周期每一个组件都可能经历从创建,挂载,更新,卸载的过程。在这个过程中的某一个阶段,用于可能会想要添加一...
    99+
    2023-06-29
  • java项目中线程的生命周期有哪些
    本篇文章为大家展示了java项目中线程的生命周期有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一个线程的生命周期:新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后...
    99+
    2023-05-31
    java 线程 生命周期
  • spring中bean的生命周期是什么
    在Spring中,Bean的生命周期包括以下几个阶段:1. 实例化:当Spring容器接收到请求时,根据配置文件或注解等方式,在内存...
    99+
    2023-09-27
    spring bean
  • mysql中sql的生命周期是什么
    这篇文章主要介绍mysql中sql的生命周期是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MYSQL Query Processingsql的执行过程和mysql体系架构基本一...
    99+
    2022-10-18
  • PHP7中生命周期指的是什么
    这篇文章给大家分享的是有关PHP7中生命周期指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP架构SAPI 介绍定义:Server Application Programming Interface服...
    99+
    2023-06-15
  • Spring中Spring Boot与Spring MVC的核心概念是什么
    这篇文章主要介绍了Spring中Spring Boot与Spring MVC的核心概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring中Spring Boot与Sp...
    99+
    2023-06-29
  • JVM中类型的生命周期是什么
    本篇文章给大家分享的是有关JVM中类型的生命周期是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。下面重点讲述  类型的生命周期。类型的生命周期涉及到: 类的装载、...
    99+
    2023-06-17
  • java中线程的完整生命周期有哪几种状态
    Thread.State类Thread.State类定义了线程的几种状态,在一个完整的生命周期中通常要经历五种状态:新建: 当一个Thread类或其子类的对象被声明并创建时;就绪: start()方法后,将进入线程队列等待CPU时间片;运行...
    99+
    2016-02-24
    java入门 java 线程 生命周期 状态
  • Java项目中如何实现控制线程的生命周期
    Java项目中如何实现控制线程的生命周期?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、线程的生命周期线程状态转换图:1、新建状态用new关键字和Thread...
    99+
    2023-05-31
    java 线程 生命周期
  • Java线程生命周期的终止与复位怎么实现
    这篇文章主要介绍“Java线程生命周期的终止与复位怎么实现”,在日常操作中,相信很多人在Java线程生命周期的终止与复位怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程生命周期的终止与复位怎...
    99+
    2023-07-02
  • Vue生命周期中的组件化是什么
    这篇文章主要介绍了Vue生命周期中的组件化是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。引出生命周期此时调用change,定时器回调修改opacity,数据修改,模板重...
    99+
    2023-06-29
  • java多线程的核心知识点是什么
    这篇文章主要介绍“java多线程的核心知识点是什么”,在日常操作中,相信很多人在java多线程的核心知识点是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java多线程的核心知识点是什么”的疑惑有所帮助!...
    99+
    2023-06-20
  • Spring中Bean的作用域与生命周期是什么
    这篇文章主要讲解了“Spring中Bean的作用域与生命周期是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中Bean的作用域与生命周期是什么”吧!一、Bean的作用域通过S...
    99+
    2023-06-22
  • vue中的生命周期和钩子函数是什么
    这篇文章主要讲解了“vue中的生命周期和钩子函数是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中的生命周期和钩子函数是什么”吧!1.什么是生命周期Vue 实例有一个完整的生命周期...
    99+
    2023-06-21
  • Vue中的生命周期和数据共享是什么
    这篇文章主要介绍了Vue中的生命周期和数据共享是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中的生命周期和数据共享是什么文章都会有所收获,下面我们一起来看看吧。一、组件的生命周期1.1 生命周期 &...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作