Java进阶篇之多线程

引言 🚀

在前面的文章中,我们介绍了NIO(Java进阶篇之NIO基础)。你是不是曾经在面对需要处理大量任务的应用时,感觉单线程根本不够用?😓 如果你想让你的应用运行得更快、更高效,多线程是你不可避免的选择!通过多线程,你可以让计算机同时处理多个任务,从而实现并行处理和高效资源利用。今天,我就带你一起深入了解 Java 中的多线程,看看如何巧妙地利用它来提升你应用的性能和响应速度💨。

让我们开始这个充满挑战与趣味的多线程之旅吧!🎢


目录

引言 🚀

一、多线程基础 🧠

1️⃣ 线程的生命周期 ⏳

二、Java中的多线程实现方式 💡

1️⃣ 继承 Thread 类 👑

2️⃣ 实现 Runnable 接口 🏃

三、线程同步 🔒

1️⃣ 同步方法 🏅

2️⃣ 同步代码块 🛠️

四、线程池 🛠️⚡

1️⃣ 使用 ExecutorService 创建线程池

五、线程的常见问题与解决方案 🧐

1️⃣ 死锁

2️⃣ 线程饥饿与活锁

🧠 思维导图

​编辑

六、总结 🎯


一、多线程基础 🧠

多线程是指在同一个程序中,同时执行多个线程,每个线程有自己的执行路径。每个线程有自己的栈和程序计数器,而所有线程共享堆内存中的数据。

多线程的优势:

  • 提高程序的执行效率 🏎️
  • 利用多核处理器资源 ⚙️
  • 提升程序的响应性 💬
1️⃣ 线程的生命周期 ⏳

线程在 Java 中有一个明确的生命周期,它从创建到销毁经历了多个状态。我们可以用以下图示来简化理解👇:

  • 新建:线程对象已经创建,但尚未调用start()方法。
  • 可运行:调用start()后,线程进入可运行状态,等待 CPU 分配时间片。
  • 运行中:线程正在执行其run()方法。
  • 阻塞:线程因等待某些条件或资源变得不可执行。
  • 死亡:线程执行完毕或被强制终止。

二、Java中的多线程实现方式 💡

Java 提供了两种创建多线程的方式:继承 Thread 类和实现 Runnable 接口。我们来对比一下这两种方式的异同 🧐。

方式继承 Thread 类 💪实现 Runnable 接口 🏃
灵活性低,不能继承其他类高,可以继承其他类
线程数量每次只能继承一个线程类可以创建多个线程实例
推荐使用不常用,适合简单场景推荐,适用于复杂任务
1️⃣ 继承 Thread 类 👑

最简单的方式是直接继承 Thread 类并重写其 run() 方法。

示例代码

class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread " + Thread.currentThread().getId() + " is running!");}
}public class ThreadExample {public static void main(String[] args) {MyThread thread1 = new MyThread();thread1.start();  // 启动线程}
}

在这个例子中,MyThread 继承了 Thread 类并重写了 run() 方法。通过调用 start() 方法,线程开始运行。

2️⃣ 实现 Runnable 接口 🏃

通过实现 Runnable 接口,我们可以更灵活地创建线程,并且还可以将多个线程共享同一个 Runnable 实例。

示例代码

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread " + Thread.currentThread().getId() + " is running!");}
}public class RunnableExample {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread1 = new Thread(myRunnable);thread1.start();  // 启动线程}
}

通过这种方式,线程的创建变得更加灵活,多个线程可以共享同一个 Runnable 实例,适用于多任务并发执行。


三、线程同步 🔒

在多线程环境中,经常会遇到多个线程访问共享资源的问题。如果没有适当的同步机制,可能会导致数据不一致或者程序崩溃。💥

Java 提供了几种常见的同步机制:

  1. 同步方法
  2. 同步代码块
  3. Lock 接口
1️⃣ 同步方法 🏅

通过在方法声明上加 synchronized 关键字,可以让多个线程同步地访问该方法。

示例代码:

class Counter {private int count = 0;public synchronized void increment() {count++;}public synchronized int getCount() {return count;}
}public class SynchronizedExample {public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();// 创建多个线程进行并发执行Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) counter.increment();});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) counter.increment();});t1.start();t2.start();t1.join();t2.join();System.out.println("Final count: " + counter.getCount());}
}

通过 synchronized 关键字,保证了 increment()getCount() 方法的线程安全性,即使多个线程同时访问这些方法,也不会出现数据竞争问题。

2️⃣ 同步代码块 🛠️

同步方法虽然简单,但有时效率不高。我们可以将方法中的代码块进行同步,减少锁的持有时间。

示例代码:

class Counter {private int count = 0;public void increment() {synchronized (this) {count++;}}public int getCount() {return count;}
}

通过同步代码块,我们可以让多个线程同时访问非同步代码块,从而提高性能。


四、线程池 🛠️⚡

创建和销毁线程的开销是巨大的,尤其在高并发场景下。为了提高效率,Java 提供了线程池机制。线程池维护了一组预先创建好的线程,任务提交到线程池后由线程池中的空闲线程来执行。

1️⃣ 使用 ExecutorService 创建线程池
import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(3);for (int i = 0; i < 5; i++) {executorService.submit(() -> {System.out.println("Thread " + Thread.currentThread().getId() + " is executing task");});}executorService.shutdown();}
}

在这个例子中,我们创建了一个包含 3 个线程的线程池,并提交了 5 个任务。线程池中的线程会并发执行这些任务。


五、线程的常见问题与解决方案 🧐

1️⃣ 死锁

死锁是指两个或多个线程互相等待对方释放资源,导致程序永远无法继续执行。避免死锁的方法有:

  • 采用合理的资源分配顺序。
  • 使用 Lock 替代 synchronized,并使用 tryLock() 方法避免死锁。
2️⃣ 线程饥饿与活锁
  • 线程饥饿:某些线程长时间无法获得执行机会。
  • 活锁:线程持续执行某些操作,但未能完成任务。可以通过合理设计任务调度来避免。

🧠 思维导图

六、总结 🎯

多线程是提升应用性能、提高并发能力的强大工具,但同时它也带来了复杂的同步与调度问题。理解和掌握线程的生命周期、同步机制、线程池等概念,将有助于你写出高效、稳定的并发程序。👨‍💻👩‍💻

今天我们通过示例代码和对比分析,深入了解了 Java 多线程的基本概念和常见技巧,掌握了如何通过线程池、高效的同步机制以及合理的设计来提升程序性能。🚀

在接下来的文章中,我们将继续探讨Java中线程的创建和运行以及其他重要特性,敬请期待!

👉 如果你觉得这篇文章对你有所帮助,欢迎点赞、收藏、分享!😊

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

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

相关文章

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释

问题&#xff1a;在默认的Visual Studio中&#xff0c;选择单行代码后&#xff0c;按下Ctrl /键会将代码注释掉&#xff0c;但再次按下Ctrl /键时&#xff0c;会进行双重注释&#xff0c;这不是我们想要的。 实现效果&#xff1a;当按下Ctrl /键会将代码注释掉&#xff0c;…

DeepSeek投喂数据(训练AI)

1、拉取nomic-embed-text 打开命令行&#xff0c;运行&#xff1a;ollama pull nomic-embed-text 这里需要先安装ollama &#xff0c;不过大家应该在本地部署模型时已经安装了 拉取成功就行了&#xff0c;后续在配置AnythingLLM时用到 2、下载 AnythingLLM 地址&#xff1a…

【原创精品】基于Springboot3+Vue3的学习计划管理系统

大家好&#xff0c;我是武哥&#xff0c;最近给大家手撸了一个基于SpringBoot3Vue3的学习计划管理系统&#xff0c;可用于毕业设计、课程设计、练手学习&#xff0c;系统全部原创&#xff0c;如有遇到网上抄袭站长的&#xff0c;欢迎联系博主~ 项目演示视频 https://www.bili…

逆势而上,门店规模拓展的智慧攻略-中小企实战运营和营销工作室博客

逆势而上&#xff0c;门店规模拓展的智慧攻略-中小企实战运营和营销工作室博客 在竞争激烈、风云变幻的商业市场中&#xff0c;多数品牌在困境中艰难求生&#xff0c;而部分佼佼者却能突破重重阻碍&#xff0c;实现门店规模的逆势扩张。这些成功案例背后&#xff0c;究竟隐藏着…

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容&#xff1a; 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法&#xff0c;模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性&#xff0c;比如容易陷入局部最优&#xff0c;收敛速度慢等&#xff0c;所以改进型的GWO可能通过不同的策略来优化这些…

网络安全与AI:数字经济发展双引擎

在2025年年初&#xff0c;一场科技攻防战引发了全球关注。国产人工智能DeepSeek的爆火&#xff0c;伴随着大规模的网络攻击事件&#xff0c;将网络安全的重要性推上了风口浪尖。 在此背景下&#xff0c;我们计划探讨网络安全与人工智能如何为数字经济发展提供强大动力。网络安…

2.11学习记录

web——CTFHub XSS学习 学习资料&#xff1a;xss&#xff08;跨站攻击&#xff09; 原理 1.黑客发送带有xss恶意脚本的链接给用户 2.用户点击了恶意链接&#xff0c;访问了目标服务器&#xff08;正常的服务器&#xff09; 3.目标服务器&#xff08;正常的服务器&#xff09…

个人毕业设计--基于HarmonyOS的旅行助手APP的设计与实现(挖坑)

在行业混了短短几年&#xff0c;却总感觉越混越迷茫&#xff0c;趁着还有心情学习&#xff0c;把当初API9 的毕业设计项目改成API13的项目。先占个坑&#xff0c;把当初毕业设计的文案搬过来 摘要&#xff1a;HarmonyOS&#xff08;鸿蒙系统&#xff09;是华为公司推出的面向全…

零成本搭建私人图床教程:CloudFlare R2 + PicGo 完整方案

零成本搭建私人图床教程&#xff1a;CloudFlare R2 PicGo 完整方案 &#x1f680; 前言 图片托管服务在现代内容创作中扮演着重要角色。无论是技术博客、文档编写&#xff0c;还是在线教程制作&#xff0c;都离不开可靠的图片存储和分发系统。本教程将详细介绍如何利用 Clou…

Word2vec Skip-Gram 模型

图例 Skip-gram 模型&#xff0c;假设句子中的每个词都决定了相邻词的选取&#xff0c;所以你可以看到Skip-gram模型的输入是 W t W_{t} Wt​&#xff0c; 预测的输出是 W t W_t Wt​ 周边的词 也是说Skip-gram的目标是&#xff1a;给定一个中心词 W t W_t Wt​, 预测其上下…

【R语言】相关系数

一、cor()函数 cor()函数是R语言中用于计算相关系数的函数&#xff0c;相关系数用于衡量两个变量之间的线性关系强度和方向。 常见的相关系数有皮尔逊相关系数&#xff08;Pearson correlation coefficient&#xff09;、斯皮尔曼秩相关系数&#xff08;Spearmans rank corre…

网络工程师 (32)TRUNK

一、定义 TRUNK&#xff0c;也称为端口汇聚、链路汇聚或多链路汇聚&#xff0c;是一种网络技术&#xff0c;其本质是将多个以太网端口绑定在一起作为一个逻辑链路来使用。通过TRUNK技术&#xff0c;用户在使用这个逻辑链路时&#xff0c;就好像是在使用一条独立的物理链路一样&…

“可通过HTTP获取远端WWW服务信息”漏洞修复

环境说明&#xff1a;①操作系统&#xff1a;windows server&#xff1b;②nginx&#xff1a;1.27.1。 1.漏洞说明 “可通过HTTP获取远端WWW服务信息”。 修复前&#xff0c;在“响应标头”能看到Server信息&#xff0c;如下图所示&#xff1a; 修复后&#xff0c;“响应标头…

编译和链接【三】

文章目录 编译和链接【三】前言系列文章入口编译过程词法分析语法分析语义分析生成中间代码汇编链接 编译和链接【三】 前言 在我大一的时候&#xff0c; 我使用VC6.0对C语言程序进行编译链接和运行 &#xff0c; 然后我接触了VS&#xff0c; Qt creator等众多IDE&#xff0c…

波导阵列天线学习笔记8 高增益、低轴比的3D打印Ka波段圆极化单脉冲天线阵列

摘要&#xff1a; 本文中&#xff0c; 一种3D打印的16x16圆极化单脉冲天线阵列在Ka波段研究&#xff0c;有着高增益和低轴比的特点。此单脉冲天线阵列有着四个低剖面的左旋圆极化子阵列和一个顺序旋转的和差网络。这四个子阵列正交连接着和差网络的输出&#xff0c;保证了传统2…

高通android WIFI debug

参考高通文档&#xff1a;80-76240-16_REV_AA_Wi-Fi_Debug_Techniques 大纲 一、 WLAN Debug Logs –logcat ■ Logcat log logcat is a command-line tool that dumps the log of system messages, ■ Including stack traces when the device throws an error. ■ Need t…

Pytest自动化测试框架总结

1、pytest简介 pytest是Python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高。 执行测试过程中可以将某些测试跳过&#xff0c;或者对某些预期失败的case标记成失败能够支持简单的单元…

交叉编译工具链下载和使用

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

【SVN基础】

软件&#xff1a;ToritoiseSVN 代码版本回退&#xff1a;回退到上一个版本 问题&#xff1a;SVN版本已经提交了版本1和版本2&#xff0c;现在发现不需要版本2的内容&#xff0c;需要回退到版本1然后继续开发。 如图SVN版本已经提交到了107版本&#xff0c;那么本地仓库也已经…

作业:zuoye

1.闹钟&#xff08;错的&#xff09; #include "widget.h" #include "ui_widget.h" #include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 初始化定时器objTimer new QTimer(th…