Java EE初阶启程记02---认识线程 - 实践

news/2025/10/23 10:06:59/文章来源:https://www.cnblogs.com/ljbguanli/p/19159713

Java EE初阶启程记02---认识线程 - 实践

 个人主页:寻星探路

作者简介:Java研发方向学习者

个人专栏:、《

⭐️人生格言:没有人生来就会编程,但我生来倔强!!!



目录

1、概念

1.1线程是什么

1.2为什么要有线程

1.3进程和线程的区别

1.4Java的线程和操作系统线程的关系

2、第一个多线程程序

3、创建线程

4、多线程的优势---增加运行速度


1、概念

1.1线程是什么

        ⼀个线程就是⼀个"执行流",每个线程之间都可以按照顺序执行自己的代码。多个线程之间“同时”执行着多份代码。      

        还是回到我们之前的银行的例子中。之前我们主要描述的是个人业务,即一个人完全处理自己的业务。我们进一步设想如下场景:

        ⼀家公司要去银行办理业务,既要进行财务转账,⼜要进行福利发放,还得进行缴社保。

        如果只有张三一个会计就会忙不过来,耗费的时间特别长。为了让业务更快的办理好,张三又找来两位同事李四、王五一起来帮助他,三个人分别负责一个事情,分别申请一个号码进行排队,自此就有了三个执行流共同完成任务,但本质上他们都是为了办理一家公司的业务。

        此时,我们就把这种情况称为多线程,将⼀个大任务分解成不同小任务,交给不同执行流就分别排队执行。其中李四、王五都是张三叫来的,所以张三一般被称为主线程(MainThread)。

1.2为什么要有线程

首先,"并发编程"成为"刚需"

        单核CPU的发展遇到了瓶颈,要想提高算力,就需要多核CPU,而并发编程能更充分利用多核CPU资源

        有些任务场景需要“等待IO”,为了让等待IO的时间能够去做⼀些其他的工作,也需要用到并发编程。

其次,虽然多进程也能实现并发编程,但是线程比进程更轻量

        创建线程比创建进程更快

        销毁线程比销毁进程更快

        调度线程比调度进程更快

最后,线程虽然比进程轻量,但是人们还不满足,于是又有了“线程池”(ThreadPool)和“协程” (Coroutine)

1.3进程和线程的区别

        进程是包含线程的,每个进程至少有一个线程存在,即主线程。

        进程和进程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间。

        比如之前的多进程例子中,每个客户来银行办理各自的业务,但他们之间的票据肯定是不想让别人知道的,否则钱不就被其他人取走了么。而上面我们的公司业务中,张三、李四、王五虽然是不同的执行流,但因为办理的都是一家公司的业务,所以票据是共享着的。这个就是多线程和多进程的最大区别。

        进程是系统分配资源的最小单位,线程是系统调度的最小单位。

        一个进程挂了一般不会影响到其他进程,但是一个线程挂了,可能把同进程内的其他线程一起带走(整个进程崩溃)。

1.4Java的线程和操作系统线程的关系

        线程是操作系统中的概念,操作系统内核实现了线程这样的机制,并且对用户层提供了一些API供用户使用(例如Linux的pthread库)

        Java 标准库中Thread类可以视为是对操作系统提供的API进行了进一步的抽象和封装

2、第一个多线程程序

感受多线程程序和普通程序的区别:

        每个线程都是一个独立的执行流

        多个线程之间是“并发”执行的

 import java.util.Random;public class ThreadDemo {private static class MyThread extends Thread {@Overridepublic void run() {Random random = new Random();while (true) {// 打印线程名称System.out.println(Thread.currentThread().getName());try {// 随机停⽌运⾏ 0-9 秒Thread.sleep(random.nextInt(10));} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {MyThread t1 = new MyThread();t1.start();Random random = new Random();while (true) {// 打印线程名称System.out.println(Thread.currentThread().getName());try {Thread.sleep(random.nextInt(10));} catch (InterruptedException e) {// 随机停⽌运⾏ 0-9 秒e.printStackTrace();}}}}

使用 jconsole 命令观察线程

3、创建线程

方法1继承Thread类

        继承Thread来创建一个线程类

class MyThread extends Thread {@Overridepublic void run() {System.out.println("这⾥是线程运⾏的代码");}
}

        创建MyThread类的实例

MyThread t = new MyThread();

        调用start方法启动线程

t.start();        // 线程开始运⾏

方法2实现Runnable接口

1)实现Runnable接口

 class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("这⾥是线程运⾏的代码");}}

2)创建Thread类实例,调用Thread的构造方法时将Runnable对象作为target参数

Thread t = new Thread(new MyRunnable());

3)调用start方法

t.start();        // 线程开始运⾏

对比上面两种方法:

        继承Thread类,直接使用this就表示当前线程对象的引用

        实现Runnable接口,this表示的是MyRunnable的引用,需要使用Thread.currentThread()

其他变形

        匿名内部类创建Thread子类对象

// 使⽤匿名类创建Thread ⼦类对象
Thread t1 = new Thread() {@Overridepublic void run() {System.out.println("使⽤匿名类创建Thread⼦类对象");}
};

        匿名内部类创建Runnable子类对象

// 使⽤匿名类创建Runnable⼦类对象
Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("使⽤匿名类创建 Runnable ⼦类对象");}
});

        lambda表达式创建Runnable子类对象

// 使⽤ lambda 表达式创建 Runnable ⼦类对象
Thread t3 = new Thread(() -> System.out.println("使⽤匿名类创建 Thread 子类对象"));
Thread t4 = new Thread(() -> {System.out.println("使⽤匿名类创建 Thread ⼦类对象");
});

4、多线程的优势---增加运行速度

可以观察多线程在一些场合下是可以提高程序的整体运行效率的。

        使用 System.nanoTime() 可以记录当前系统的纳秒级时间戳

        serial 串行的完成一系列运算,concurrency 使用两个线程并行的完成同样的运算。

public class ThreadAdvantage {// 多线程并不⼀定就能提⾼速度,可以观察,count 不同,实际的运⾏效果也是不同的private static final long count = 10_0000_0000;public static void main(String[] args) throws InterruptedException {// 使⽤并发⽅式concurrency();// 使⽤串⾏⽅式serial();}private static void concurrency() throws InterruptedException {long begin = System.nanoTime();// 利⽤⼀个线程计算 a 的值Thread thread = new Thread(new Runnable() {@Overridepublic void run() {int a = 0;for (long i = 0; i < count; i++) {a--;}}});thread.start();// 主线程内计算 b 的值int b = 0;for (long i = 0; i < count; i++) {b--;}// 等待 thread 线程运⾏结束thread.join();// 统计耗时long end = System.nanoTime();double ms = (end - begin) * 1.0 / 1000 / 1000;System.out.printf("并发: %f 毫秒%n", ms);}private static void serial() {// 全部在主线程内计算 a、b 的值long begin = System.nanoTime();int a = 0;for (long i = 0; i < count; i++) {a--;}int b = 0;for (long i = 0; i < count; i++) {b--;}long end = System.nanoTime();double ms = (end - begin) * 1.0 / 1000 / 1000;System.out.printf("串⾏: %f 毫秒%n", ms);}}

并发:399.651856毫秒

串行:720.616911毫秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/944000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年10月北京口腔医院排行:十强机构对比指南

“到底该去哪家?”——这是不少北京居民在牙齿突然疼痛、孩子乳牙松动或父母缺牙需要种植时,最先蹦出的疑问。北京口腔机构数量多、宣传杂,公立三甲难挂号,私立诊所又担心资质。2025年北京市卫健委发布的《口腔医疗…

springcloud中网关gateway总结

在 Spring Cloud 微服务架构中,网关(Gateway)是客户端与微服务集群之间的 "统一入口",负责处理跨服务的共性问题。以下从作用、实现原理、核心配置(含限流、鉴权详解)三方面展开说明。 一、网关的核心…

郑州短视频代运营公司口碑榜:TOP3企业权威推荐

在数字化营销浪潮中,短视频已成为企业品牌推广的核心渠道之一。郑州作为中原地区的重要经济中心,短视频代运营服务需求持续增长。据行业统计,2023年河南省短视频用户规模突破5000万,年均增长率超20%,代运营市场呈…

深入大模型-2-大模型微调之Windows10安装大语言模型Unsloth微调环境 - 教程

深入大模型-2-大模型微调之Windows10安装大语言模型Unsloth微调环境 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

K.20

K.20K20ITU-T K.20建议书规定了安装在电信中心的电信设备的抗力要求和测试程序。本建议书所述的过电压或过电流是指包括发电厂上或附近发生雷击、相邻交流电源线或铁路系统造成短期导电、电源故障引发大地电位上升以及…

C#语法查缺补漏

C#语法补充 空条件运算符和空合并运算符var clientIp = context.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown";- 首先RemoteIpAddress允许为空 - 若这个表达式(context.HttpContext…

Docker 部署 Elasticsearch 全流程手册

Elasticsearch(简称 ES)是一款基于 Lucene 构建的分布式、高扩展、高实时的全文搜索引擎,也是 ELK(Elasticsearch + Logstash + Kibana)技术栈的核心组件,目前广泛应用于企业级数据检索与分析场景。在开始 Elast…

办公神器-好用的办公软件

整理分享几个好用的办公软件: 1、互联网资源下载软件:ndm 下载方式:edg浏览器下载下载地址:https://www.neatdownloadmanager.com/index.php/en/进行下载。 2、压缩工具:7-zip 下载方式:edg浏览器搜索:z-ziphtt…

基于TMS320F28034的全桥LLC电源控制

基于TMS320F28034的全桥LLC电源控制实现,包含400V→48V转换的稳定版方案一、核心参数配置 // 系统时钟配置 #define SYSCLK_FREQ 150e6 // 150MHz #define PWM_FREQ 100e3 // 100kHz开关频率 #define EPWM_CLKDI…

ORA-12154TNS-03505 案例分享2

ORA-12154&TNS-03505 案例分享22025-10-23 09:58 潇湘隐者 阅读(0) 评论(0) 收藏 举报前几天遇到了ORA-12154&TNS-03505这个错误, 因为对其数据库环境不了解, 远程登录过去检查的时候, 了解到一些大概情况…

2025年10月ai优化推荐:主流榜单对比与避坑指南

引言与现状分析 当企业在2025年第四季度制定明年预算时,“ai优化”已从可选项变成必答题。品牌部想抓住DeepSeek、豆包、通义千问等新生流量入口,市场部担心传统SEO失灵后线索断层,IT部则苦恼于多平台算法差异大、更…

QOJ#12181. abc

题意:给定包含 `a,b,c` 的字符串,长度 $n \leq 2 \times 10^5$,求所有区间权值和,区间权值为出现次数最多字母的个数减去出现次数最少字母的个数(出现次数不为0)。思路:先统一式子,包含3种字母区间 $val_{l,r}…

2025年10月ai优化推荐:全维度对比评价助你精准决策

正在写一份面向10月采购季的技术负责人小王的私人备忘:他需要在四周内把集团分布在DeepSeek、豆包、通义千问、元宝、Kimi五平台的品牌问答准确率提升30%,同时控制预算不超过去年SEM费用的80%。小王最怕的是“各家都…

行业配置策略

策略逻辑搭建框架:行业景气度、趋势和拥挤度 构建模型: 2.1 行业景气模型:高景气+强趋势,规避高拥挤 2.2 行业趋势模型:强趋势+低拥挤,规避低景气 组合优化:轮动型/配置型 设置不同约束 求解行业权重 落地ETF/个…

2025 年最新防火涂料厂家排行榜:膨胀型 / 非膨胀型 / 厚型 / 薄型钢结构涂料厂家最新推荐

引言 在建筑与工业安全领域,防火涂料是保障人员生命与财产安全的关键防线,但其市场现状却让选购者面临重重挑战。当前市场上品牌繁杂,部分产品为降低成本偷工减料,防火性能未达国家标准,存在严重安全隐患;同时,…

AI元人文:创新决策、“躺平懒人”与针砭机制

AI元人文:创新决策、“躺平懒人”与针砭机制 当人工智能开始从“生成内容”迈向“生成决策”,一个常见的梦魇是:人类将彻底躺平,将思考的主权拱手相让,退化为被算法饲养的“认知懒人”。然而,前沿的“AI元人文”…

Kubernetes 主流网络插件的关键差异对比 - 详解

Kubernetes 主流网络插件的关键差异对比 - 详解2025-10-23 09:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display:…

dokuwiki制作侧边栏

dokuwiki制作侧边栏找到siderbar====== 导航栏 ====== ===资源导航===* [[gts游戏]]* [[gts小说]]* [[gts漫画]]* [[gts音声]] ===攻略教程===* [[gts游戏疑难杂症]]* [[gts游戏攻略]]

MySQL的这6大雷区,大部分人都会踩中!

前言 有些小伙伴在工作中,可能经常遇到这样的场景:系统上线初期运行良好,随着数据量增长,突然某天接口超时、CPU飙升、甚至整个系统瘫痪。 排查半天,发现是某个SQL语句写的有问题,或者是数据库配置不当导致的。 …