【Java EE初阶 --- 多线程(初阶)】多线程的基本内容

基于淘宝商城用户购物行为数据分析系统 本文使用HIve+superset技术对阿里云天池提供的淘宝用户购物数据进行处理分析,得到有价值的信息并对平台提出有建设性意义的意见。 阅读详情

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

前言

既然有多线程,那么是不是也应该有单线程?答案是肯定的。其实单线程也叫进程,由上篇博客知道,进程中有多个线程,那么只有一个线程的进程就是单线程。我们的main主线程,之前的认知,main方法执行完毕,程序(进程)就结束了,那是因为之前没有接触到多线程程序,这篇博客将为我们认识多线程。。。

认识多线程(Thread的常见属性)

IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否为后台线程isDaemon()
是否存活isAlive()

java中给每个运行的线程分配id,表示身份,不同线程不会重复
线程名称就是你给线程起名字。
线程状态后面会说到,表示当前线程所处的状态。
优先级顾名思义,优先级高的线程更容易被调度到。
那么什么是后台线程呢?是不是还有前台线程?

Daemon -> 守护 “守护线程”==“后台线程”

JVM中自带的线程,他们的存在不影响进程结束(即使这些线程继续运行,但是进程要结束,他们也一起结束),这种就是后台线程。

前台线程

在多线程程序中,如果线程1结束了,但是线程2或者线程3还在运行,进程依旧存在。线程2,线程3能影响到 进程继续存在,这样的线程就是前台线程。(我们写的代码包括main主线程默认都是前台线程)

<举个例子>我们在吃席的时候,我吃饱了,整个活动还没有结束,我可以偷偷溜走,对整个活动没有影响,那么我就是后台线程:活动主持人说:活动结束,代表整个活动结束,这个时候主持人才是前台线程。整个活动像我一样的人有多个,主持人也可能有多个,这就是多线程。

JVM会在一个进程的所有非后台线程结束后,才会结束进程。

线程存活就是run方法运行结束。

Java代码中创建的Thread对象,和系统中的线程是一一对应的关系,但是Thread对象的生命周期和系统中的线程的生命周期是不同的。

在这里插入图片描述
这个代码的逻辑:3s后系统中线程就结束了,但是观察结果:
在这里插入图片描述
有四个true,根本原因是:t线程结束与第四次结果,不一定谁先谁后!是操作系统随机调度。

线程启动 - start()

上篇博客我们已经知道如何创建一个线程对象,但是线程对象被创建出来并不代表这线程就开始运行,你还需要调用一个方法start(),“动起来”。

这个方法是java标准库/JVM提供的方法,本质上是调用操作系统的API…

只有调用start(),才真的在操作系统底层中创建出一个线程。
在这里插入图片描述

每个Thread对象,都只能start一次。

线程终止

Thread 内部包含了⼀个 boolean 类型的变量作为线程是否被中断的标记

lambda这里的定义是在new Thread之前,也是在Thread t之前,所以需要引用来调用方法

public static Thread currentThread();//哪个线程调用这个方法,返回这个线程的引用(类似this) >

在这里插入图片描述
通过isInterruoted()方法判断当前线程是否被终止了
在这里插入图片描述
注意:t.interrupt();主动去终止线程
这种⽅式通知收到的更及时,即使线程正在 sleep 也可以⻢上收到。

注意:正常来说:调用interrupt方法就会修改isIntegerruptted方法内部的标志位设为true,由于把sleep唤醒了,sleep内部就会把isIntegerruptted标志位改为false.这个时候的结果就是这样:
在这里插入图片描述
程序没有终止,还在执行

Java中线程终止,不是“强制性”d的措施,选择权还在被终止的线程手上(catch),主要看线程t的代码怎么写

线程等待

多线程之间 并发执行 ,意味着资源就随机调度的,这对我们程序员很不友好,要考虑的因素太多了;但是join()方法能够解决多个线程之间结束的先后顺序问题。

public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
           for(int i=0;i<3;i++){
               System.out.println("hello Thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
            System.out.println("t线程结束");
        });
        t.start();
        t.join();//main线程“阻塞等待”,等待 t 线程执行完毕
        System.out.println("main线程结束");
    }

在main线程中,调用t.join()
效果:让 main 线程等待 t 线程结束

在这里插入图片描述
这就意味着只要 t 线程不结束,main就只能一直等待,这明显不符合计算机的初衷。这个时候就需要一个“最大等待时间"。

public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
           for(int i=0;i<3;i++){
               System.out.println("hello Thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
            System.out.println("t线程结束");
        });
        t.start();
        t.join(2000);//最多等待2s
        System.out.println("main线程结束");
    }

在这里插入图片描述

线程状态

在操作系统的角度去看待线程,无非就是就绪状态和阻塞状态~~
Java线程其实是操作系统对线程的封装。但是Java中针对状态,也进行了封装,为了观察线程处于什么状态,我们可以使用state表示…

遍历线程状态…
在这里插入图片描述

public class Demo4 {
    public static void main(String[] args) {
        for(Thread.State state:Thread.State.values()){
            System.out.println(state);
        }
    }
}

得到一下几种状态

NEW:有工作,但是还没有动起来
RUNNABLE:可工作,可以表示在工作中,也可以表示即将开始工作
BLOCKED:排队等待(比较特殊,由锁导致的阻塞)
WAITING:排队等待
TIMED_WAITING:排队等待
TERMINATED:工作完成

NEW

线程开始状态,此时是new了一个Thread对象,还没有start()
在这里插入图片描述

TERMINATED

线程已经结束,但是Thread对象还在(要是 t 不在了,那么这个状态应该是显示不出来才对,而现在可以正常打印出TERMINATED状态)
在这里插入图片描述

RUNNABLE

此时线程一直处于工作状态,注意右上角的运行标志,可以知道,线程一直未结束。
在这里插入图片描述

TIMED_WAITING

此状态表示阻塞,细化说就是:指定时间阻塞。
在这里插入图片描述

有时候A线程需要等待B线程的运行结果,但是可能B线程陷入死循环,那么A线程要不要一直等待B线程的结果呢?

当然不用,在最大等待上限结束后,直接结束 B线程

线程状态之间来回切换
在这里插入图片描述

WAITING

与TIMED_WAITING状态很相似,但是比TIMED_WAITING要死板。
TIMED_WAITING指定了等待时间,但是WAITING只是死等(没有超时间的阻塞等待)
在这里插入图片描述

此时main线程在等待t线程执行完毕
由Java管理后台可以看到,此时main线程处于WAITING状态,死等。
在这里插入图片描述

总结:多线程中,理解线程状态是至关重要的,是帮助程序员调试代码的关键
在这里插入图片描述

完结


可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散 ~ ~ ~

深入解析Buck开关电源中的死区时间设计及其对系统性能的影响 本文深入解析了Buck开关电源中死区时间的设计原理及其对系统性能的关键影响。死区时间通过防止上下管同时导通来避免穿通电流,确保系统安全。文章详细探讨了其工作机制、设置时的效率与安全权衡,以及不当设置对效率、稳定性和EMI的连锁反应,并提供了基于实测的调试方法与实战案例。 阅读详情

相关推荐

Synopsys Sentaurus TCAD新手教程:从零开始仿真trench MOSFET(附完整代码解析)

本文提供Synopsys Sentaurus TCAD新手教程,详细讲解从零开始仿真trench MOSFET的全过程,包括环境搭建、外延生长、沟槽刻蚀、栅极形成等关键步骤,并附完整代码解析。通过实际案例帮助半导体工程师掌握Sprocess操作技巧,优化工艺参数设置,提升仿真效率。

weixin_30505225的博客 217

【Java EE初阶】多线程-初阶

使⽤没有共享资源的模型适⽤共享资源只读,不写的模型a. 不需要写共享资源的模型b. 使⽤不可变对象直⾯线程安全(重点)a. 保证原⼦性b. 保证顺序性c. 保证可⻅性1.线程的优点创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多线程占⽤的资源要⽐进程少很多能充分利⽤多处理器的可并⾏数量在等待慢速I/O操作结束的同时,程序可执⾏其他的计算任务。

2402_85428625的博客 2466

uniapp中renderjs实战:手把手教你实现SSE即时通讯(附完整代码)

本文通过一个完整的实战案例,详细讲解了如何在uni-app中使用RenderJS实现SSE即时通讯功能。文章剖析了RenderJS作为Vue视图层强力补充的原理,并提供了包含自动重连、状态管理等健壮性设计的完整代码,帮助开发者突破框架限制,高效集成浏览器原生API。

weixin_29005499的博客 189

【Java EE】多线程-初阶 多线程的一些基础用法

使⽤没有共享资源的模型适⽤共享资源只读,不写的模型a. 不需要写共享资源的模型b. 使⽤不可变对象直⾯线程安全(重点)a. 保证原⼦性b. 保证顺序性c. 保证可⻅性1.线程的优点创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多线程占⽤的资源要⽐进程少很多能充分利⽤多处理器的可并⾏数量在等待慢速I/O操作结束的同时,程序可执⾏其他的计算任务。

2402_85428625的博客 3145

RealSense D455启动教程

RealSense D455启动教程 修改rs_camera.launch

每天进步一点点 2417

概率论 知识图谱 + 实战案例解析

本文通过构建概率论知识图谱,系统梳理了从随机试验、概率、条件概率到随机变量与分布的核心概念及其内在联系。结合朴素贝叶斯分类器和蒙特卡洛模拟等实战案例,深入解析了条件概率、独立性及大数定律等理论如何应用于机器学习与实际问题求解,旨在帮助读者建立结构化思维,将理论有效转化为解决实际问题的能力。

weixin_29051193的博客 267

JAVA EE_多线程-初阶(一)

我们可以先把进程理解为一个医院的门诊部,而门诊部是一个大类,这里面又有多个门诊,例如:内科门诊,外科门诊,妇科门诊,如果让张三一个人来做是负责不过来的,所以张三叫来了李四,王五,一个人负责一个门诊,这样就大大提高了效率。而张三,李四,王五就是线程,即多线程,其中张三是,因为李四线程和王五线程是由张三线程叫来的。

2401_82914354的博客 1338

Allegro17.4原理图-PCB双向联动技巧:从网表生成到同步高亮

本文深入解析了Cadence Allegro 17.4中原理图与PCB的深度双向联动技巧。核心在于通过精准的网表生成与管理、实时的跨窗口交互高亮与信号追踪,以及元件与封装的智能匹配更新,构建高效协同设计工作流。掌握这些技巧能显著提升高速、高密度电路设计的效率与准确性,实现从逻辑设计到物理实现的无缝衔接。

weixin_29178069的博客 358

【Java EE初阶---多线程(初阶)】初识计算机

经过了之前数据结构的学习,相信大多数人已经相比与开始的自己,已经有了十足的进步,结束数据结构的学习,为了揭开计算机背后神秘的面纱,同时为了更好迎接更多挑战,下面就让我们一起进入【Java EE初阶】部分吧!

optimistic_chen的博客 1199

MOSFET导通电阻Rdson全解析:物理组成、公式推导与工程选型要点

在功率电子设计中,MOSFET作为核心开关器件,其导通电阻Rdson直接决定导通损耗与系统效率。从半导体物理角度看,Rdson并非单一固定值,而是由源极电阻、沟道电阻、累积层电阻、JFET区电阻、漂移区电阻及衬底电阻等多个分量串联而成,并随栅极驱动电压、结温以及击穿电压等级发生显著变化。理解Rdson的物理来源与数学表达,有助于工程师在低压大电流与高压小电流等不同场景中合理选型、优化驱动电压并准确估算热损耗。文章从沟道电阻公式出发,深入剖析耐压与导通电阻的物理矛盾、温度系数的影响规律,并给出数据手册参数的正

weixin_29163857的博客 195

如何用matlab扫频法测考虑频率耦合的并网逆变器的序阻抗,如何实现?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1193

【JAVA EE初阶】多线程(上)

不同的操作系统之间不兼容,java却有“跨平台”特性,不需要任何修改,就可以在不同的系统上完成同样的功能,原因在于Java虚拟机,不同的主流系统都有各自的Java 虚拟机,Windows有Windows JVM,Linux有Linux JVM,这些JVM是不同的程序,但是上层支持的Java字节码是一致的。当一个线程循环进行上述读取变量操作的时候,就会把主内存中的数据,拷贝到该线程的工作内存中,后续另一个线程修改,也是先修改自己的工作内存,拷贝到主内存中。等先走的线程解锁,后走的线程才能加上锁,继续执行。

2301_80802299的博客 949

【SpringBoot 4.x 第70节】夯爆了,企业级 API 设计规范落地:状态码、错误码、接口文档与兼容性(超详解)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 131

【Java EE初阶 --- 多线程(初阶)】多线程的实现案例

之前博客对多线程的是什么和基本内容都有详细了解,目前对于多线程的运用还很浅显,不能发挥出多线程应有的实力。这篇博客将带来多线程的基本应用,它会用到什么地方?又会带来什么高效的运行效率?我们又会学到什么?诸位尽情期待…

optimistic_chen的博客 1243

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java EE初阶——多线程进阶

CAS(Compare-And-Swap,比较并交换)是一种无锁(Lock-Free)的原子操作机制,用于在多线程环境下实现变量的同步。它通过硬件支持(如 CPU 指令)保证操作的原子性,避免了传统锁机制的线程阻塞和上下文切换开销,适用于高并发场景下的轻量级同步。内存地址(V):要更新的变量所在的内存位置。旧值预期(A):操作前假设的变量当前值。新值(B):准备更新的新值。从内存地址 V 中读取当前值V_cur。比较V_cur是否等于预期值 A:如果相等。

2302_80250536的博客 774

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Java EE初阶 ---多线程(初阶)】多线程的使用

上篇博客,大概说明了计算机的历史和进程这一概念,初步对计算机的组成和运行有一定了解。这篇博客将正式进入对多线程的学习,希望对大家有所帮助~ ~ ~

optimistic_chen的博客 1308

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[Java EE] 多线程编程初阶

本文系统介绍了Java多线程编程的核心概念与技术。主要内容包括:1)线程基础,包括线程与进程的区别、创建线程的5种方法;2)线程状态管理,涵盖启动、中断、等待和休眠等操作;3)线程安全问题及解决方案,重点讲解synchronized关键字和volatile的应用;4)线程间协作机制wait/notify;5)多线程经典案例,包括单例模式、阻塞队列、线程池和定时器的实现。文章深入剖析了线程调度、锁机制、内存可见性等底层原理,并提供了大量实践示例,是掌握Java并发编程的全面指南。

Boop_wu的博客 1311

Java EE初阶——初识多线程

线程是操作系统进行运算调度的最小单位,包含在进程中,共享进程资源但拥有独立的栈空间和寄存器。线程的引入解决了进程创建/销毁成本高、上下文切换开销大、通信困难等问题,提高了资源利用率和程序并发性。线程通过共享地址空间降低内存开销,优化程序结构,降低上下文切换成本。Java线程基于操作系统线程实现,通过JVM创建和管理。创建线程的方法包括继承Thread类、实现Runnable接口、使用匿名内部类和lambda表达式。Thread类提供了管理线程的常见方法,如设置守护线程、获取线程状态等。线程的启动通过star

2302_80250536的博客 1072

【JAVA EE初阶】多线程(进阶)

本质上是懒汉模式。使⽤信号量可以实现 "共享锁", ⽐如某个资源允许 3 个线程同时使⽤, 那么就可以使⽤ P 操作作为加锁, V 操作作为解锁, 前三个线程的 P 操作都能顺利返回, 后续线程再进⾏ P 操作就会阻塞等待, 直到前⾯的线程执⾏了 V 操作.(乐观锁的场景,本身遇到锁竞争的概率很小,真的遇到竞争,在短时间内就能拿到锁)如果获取锁失败, ⽴即再尝试获取锁, ⽆限循环, 直到获取到锁为⽌. 第⼀次获取锁失败, 第⼆次的尝试会在极短的时间内到来. ⼀旦锁被其他线程释放, 就能第⼀时间获取到锁.

2301_80802299的博客 1013

【Java EE】多线程-初阶 多线程案例

单个实例. 在一个 java 进程中, 要求指定的类,只能有唯一一个实例。(尝试 new 多个实例的时候, 就会直接编译报错)单例模式是校招中最常考的设计模式之⼀.单例模式具体的实现⽅式有很多. 最常⻅的是 “饿汉” 和 “懒汉” 两种.(掌握这两个, 应付面试 +日常开发)类加载的同时, 创建实例. 懒汉模式 懒汉模式-单线程版 类加载的时候不创建实例. 第⼀次使⽤的时候才创建实例.(如果不使用了,就会把创建实例的代价就节省下来了) 如果是首次调用 getlnstance, 那么此时 instance

2402_85428625的博客 1405

Java EE初阶-多线程详解

文章目录一、认识线程1.1概念1.2创建线程1.3多线程的优势-增加运行速度二、Thread类及常见方法2.1Thread的常见构造方法2.2Thread的几个常见属性2.3启动一个线程-start( )2.4中断一个线程2.5等待一个线程-join( )2.6获取当前线程引用2.7休眠当前线程三、线程的状态3.1观察线程的所有状态3.2线程状态和状态转移的意义3.3观察线程的状态和转移四、多线程带来的风险(重点)4.1观察线程不安全4.2线程安全的概念4.3线程不安全的原因4.4解决之前的线程不安全问题五

m0_57180439的博客 872

Java EE初阶--多线程

进程创建是“

s060618的博客 1196

Java EE初阶——线程安全

线程的状态。

2302_80250536的博客 1259

详细讲解 —— 多线程初阶(一)认识线程(Java EE初阶)

多线程是我们学习编程的一个很重要的问题。我们在参加笔试面试的时候也是常考常问的问题。本篇文章主要是先简单的认知线程。里面的内容也比较的简单易懂,各位读者放心食用。如有错误,欢迎指正,希望和大家一起进步。......

IT_Infector的博客 1039

【Java EE初阶 --- 多线程(初阶)】线程安全问题

乐观学习,乐观生活,才能不断前进啊!!!欢迎大家访问~

optimistic_chen的博客 1229

【Java EE初阶 --- 文件】文件操作和IO

至此,以创建多线程到多线程安全就到此为止了。这篇博客将介绍计算机输入输出的相关知识,我任务这块内容主要以计算机硬件为主,如果要理解大部分IO,就要对计算机硬件有较为深刻的认识。

optimistic_chen的博客 1762
上一篇: 我的创作纪念日
下一篇: 【Java EE初阶 --- 多线程(初阶)】线程安全问题
Optimistic _ chen
博客等级 码龄3年 1553粉丝 127原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Optimistic _ chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值