并发编程:Java中的多线程与线程池!

全文目录:

    • 开篇语
      • 线程的基础概念
        • 线程生命周期
        • 线程调度
        • 线程安全
      • 线程池:Executor框架、线程池的管理与调优
        • Executor框架
        • 线程池的管理与调优
      • 并发工具类:ReentrantLock、CountDownLatch、CyclicBarrier等
        • ReentrantLock
        • CountDownLatch
        • CyclicBarrier
      • 小结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

线程的基础概念

当我们谈到并发编程时,最核心的概念之一便是线程。线程是一条执行路径,在Java中,线程允许你将一个程序分成多个并行执行的任务。Java中多线程的核心作用是提高程序的执行效率,尤其在处理I/O操作、并行计算等场景中具有重要意义。然而,线程的使用并不是那么简单,特别是在资源共享和同步时,可能会导致诸如死锁、竞态条件等问题。因此,理解线程的生命周期、调度以及线程安全机制,是编写高效并发程序的基础。

线程生命周期

在Java中,线程从创建到终止的过程被称为线程生命周期。线程的生命周期包括几个重要的状态,每个状态有其特定的行为和转变过程。下面简要介绍每个线程状态及其转变:

  1. 新建状态(New):当你创建一个线程对象时,线程进入“新建”状态。此时,线程还没有开始执行。

    Thread t = new Thread();
    // 线程t处于New状态
    
  2. 就绪状态(Runnable):当你调用线程的start()方法时,线程进入“就绪”状态,表示线程已经准备好,等待系统分配CPU时间执行。

    t.start();  // 线程进入Runnable状态,等待调度
    
  3. 运行状态(Running):线程获得CPU时间片并开始执行。在Java中,线程可以通过Thread.sleep()等方法主动放弃执行时间片,转入“阻塞”状态。

    public void run() {System.out.println("线程开始执行...");
    }
    
  4. 阻塞状态(Blocked):线程在等待某个资源(例如I/O操作或获取锁)时,会进入“阻塞”状态。阻塞状态的线程会等待直到资源可用或获得锁。

    synchronized (this) {// 当前线程可能被阻塞// 等待锁
    }
    
  5. 终止状态(Terminated):线程执行完毕或者由于异常终止时,进入“终止”状态。线程一旦结束,它就不能再重新启动。

    // 线程执行完毕,进入Terminated状态
    
线程调度

线程调度是指操作系统决定哪个线程获得CPU时间片的过程。在Java中,线程调度依赖于操作系统,但Java也允许我们为线程设置优先级来影响调度的顺序。线程的优先级范围是1到10,其中1表示最低优先级,10表示最高优先级。Java中通过Thread.setPriority()方法来设置线程优先级。

Thread t = new Thread();
t.setPriority(Thread.MAX_PRIORITY);  // 设置最高优先级

需要注意的是,线程优先级并不总是能准确影响线程执行顺序,这取决于底层操作系统的调度策略。

线程安全

多线程编程中的一个核心问题是线程安全。当多个线程并发访问共享资源时,必须确保资源的访问不会导致数据不一致或程序崩溃。常见的线程安全问题包括:

  1. 竞态条件(Race Condition):多个线程并发访问同一资源时,程序的执行结果依赖于线程的执行顺序,导致结果不确定。比如,两个线程同时修改共享变量,可能导致数据丢失或错误。

    int count = 0;
    // 线程1执行 count++
    // 线程2执行 count++
    // 竞态条件发生
    
  2. 死锁(Deadlock):当多个线程互相等待对方释放资源时,形成了死锁,导致程序无法继续执行。

    synchronized (lock1) {synchronized (lock2) {// 代码块}
    }
    synchronized (lock2) {synchronized (lock1) {// 代码块}
    }
    
  3. 资源竞争(Resource Contention):多个线程在没有适当同步的情况下争夺资源,可能导致数据一致性问题。比如在更新数据库记录时,如果没有同步控制,可能导致多个线程同时修改同一数据。

为了解决线程安全问题,Java提供了多种方法,如使用synchronized关键字、ReentrantLock等工具类来进行线程同步。

线程池:Executor框架、线程池的管理与调优

在Java中,线程池是管理线程并发执行的重要工具。使用线程池可以避免频繁创建和销毁线程的开销,提升系统性能,尤其是对于高并发的应用程序来说,线程池是非常必要的。Java提供了Executor框架,用于简化线程池的创建和管理。

Executor框架

Executor框架是Java中用于管理线程池的核心框架。它包含了几个接口和类,用于创建和管理线程池。Executor框架最常用的实现类是ThreadPoolExecutor,它提供了许多灵活的配置选项,能够满足不同场景下的需求。

常见的线程池类型有:

  1. FixedThreadPool:一个固定大小的线程池,适用于负载稳定、任务数目确定的场景。

    ExecutorService executorService = Executors.newFixedThreadPool(10);
    executorService.submit(() -> {System.out.println("Task executed by fixed thread pool.");
    });
    
  2. CachedThreadPool:一个线程池,它会根据任务量动态创建线程,适合任务量非常大,但每个任务执行时间较短的场景。

    ExecutorService executorService = Executors.newCachedThreadPool();
    executorService.submit(() -> {System.out.println("Task executed by cached thread pool.");
    });
    
  3. SingleThreadExecutor:一个单线程池,适合顺序执行任务的场景。

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    executorService.submit(() -> {System.out.println("Task executed by single thread pool.");
    });
    
线程池的管理与调优

要充分发挥线程池的性能,合理的线程池配置和调优是必不可少的。线程池的主要参数有:

  1. 核心线程数(corePoolSize):线程池中始终保持的线程数。如果线程池中的线程数低于核心线程数,即使没有任务,线程池也会创建新的线程。

  2. 最大线程数(maximumPoolSize):线程池可以创建的最大线程数。当队列满时,线程池会根据配置的最大线程数创建新线程,处理更多的任务。

  3. 空闲线程存活时间(keepAliveTime):线程池中的线程在空闲时保持活跃的时间。超过这个时间的线程会被销毁。

  4. 任务队列(workQueue):存放等待执行任务的队列。可以选择不同类型的队列来管理任务的提交。

通过调整这些参数,可以让线程池适应不同的工作负载,提升并发执行的效率。


并发工具类:ReentrantLock、CountDownLatch、CyclicBarrier等

Java还提供了丰富的并发工具类,帮助我们更高效地进行线程同步和协作。这些工具类可以帮助我们解决一些复杂的同步问题,而不需要过多地依赖synchronized关键字。

ReentrantLock

ReentrantLock是一个显式锁,相较于synchronized,它提供了更灵活的锁操作,如尝试加锁、可中断的加锁、锁的公平性等。它适用于需要精确控制线程同步的场景。

ReentrantLock lock = new ReentrantLock();
lock.lock();  // 获取锁
try {// 执行临界区代码
} finally {lock.unlock();  // 释放锁
}
CountDownLatch

CountDownLatch是一种同步工具,用于让一个线程等待多个线程完成任务。它通过一个计数器来控制,计数器的值会随着每个线程的任务完成而减少,当计数器为0时,等待的线程就可以继续执行。

CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {new Thread(() -> {// 执行任务latch.countDown();  // 任务完成,计数器减1}).start();
}
latch.await();  // 等待计数器为0
System.out.println("All threads finished.");
CyclicBarrier

CyclicBarrier用于在多个线程达到某个共同点时,使得所有线程同步执行。适用于需要多线程分段执行的场景。

CyclicBarrier barrier = new CyclicBarrier(3, () -> {System.out.println("All threads have arrived at the barrier.");
});
for (int i = 0; i < 3; i++) {new Thread(() -> {try {// 执行任务barrier.await();  // 等待其他线程到达屏障} catch (Exception e) {e.printStackTrace();}}).start();
}

小结

在Java的并发编程中,我们涉及了线程生命周期、线程池管理、并发工具类等多个方面。通过合理使用这些技术,我们可以创建高效、线程安全的并发应用程序。然而,线程的使用是非常精细的,必须小心调优和管理,避免常见的并发问题(如死锁、竞态条件等)。希望通过这篇文章,大家能够对Java并发编程有更深入的理解,也能在实际开发中更自如地应用这些技术。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

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

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

相关文章

语义分割一站式到底怎么玩?

语义分割模型&#xff0c;复现或改进、对比实验&#xff0c;&#xff0c;欢迎交流&#xff0c;完爆各种详细需求1、可以接以下语义分割模型dai做 DeepLabV3、PSPnet、HRnet、Segformer、Unet、u2net、cenet、erfnet、hcanet、hiformer、uiunet、nnunet、saunet、unext、dscnet、…

由于不对称GND过孔配置,差分信号过孔上的差模到共模转换

本文研究了靠近高速差分信号过孔的接地过孔的影响以及由此产生的差模到共模的转换。该工作显示了接地 &#xff08;GND&#xff09; 过孔和差分信号之间距离的影响 &#xff08;Diff. SIG.&#xff09;;GND过孔不对称配置的影响;介电厚度和平面之间跃迁次数的影响。 印刷电路板…

Axios 实例配置指南

今天分享一段 Axios 实例配置的代码&#xff0c;用于 Web Front - End 项目的构建。 一、为什么使用 Axios 在前端项目中&#xff0c;与后端进行数据交互是必不可少的。Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;它提供了简洁的 API 和强大的功能&#xff0c;能够方…

分分合合,门模块方案又兴起了

文章目录前言1.方案概述1.1 功能需求1.2 框图2.供电和通信2.1 理想二极管控制器2.2 SBC2.3 高边开关3.门模块PCBA3.1 后视镜3.2 车窗和电动门4.车锁控制PCBA5.氛围灯PCBA6.未来趋势前言 最近接触了一些之前做门锁、门控、BCM的客户&#xff0c;发现他们或多或少都在做一些门模…

AWD相关知识

AWD AWD&#xff1a;Attack With Defence&#xff0c;即攻防对抗&#xff0c;比赛中每个队伍维护多台服务器&#xff08;一般两三台&#xff0c;视小组参赛人数而定&#xff09;&#xff0c;服务器中存在多个漏洞&#xff08;web层、系统层、中间件层等&#xff09;&#xff0c…

基于CNN(卷积神经网络)的门牌号识别

1、官网下载SVHN数据集svhn是数据集&#xff0c;Dataset2、HOG特征3、支持向量机 SVM(Support Vector Machine&#xff0c;SVM) 分类器4、cv2需要导入 pip install opencv-python5、HOG特征提取5.1 伽马校正归一化预补偿反归一化无伽马校正有伽马校正5.2 灰度化5.3 图像梯度计…

使用LLAMA_cpp_python进行qwen2.5-vl-7b-instruct进行推理

目标&#xff1a;使用python的llama_cpp运行qwen2.5vl模型实现提交图片和文本回答文本效果 遇到的问题&#xff1a; 和提交信息的判断关键点llama.cpp 作为一个用 C/C 编写的轻量级大语言模型推理框架&#xff0c;让你能在各种硬件上高效运行模型。它通过降低部署和运行大模型的…

PDF,HTML,md格式文件在线查看工具

VUE3 实现了 PDF,HTML,md格式文件在线查看工具 在线体验地址: http://114.55.230.54/ 实现了一款漂亮的PDF,HTML,md格式文件在线查看网页工具 1、PDF预览1.1 实现代码 <script setup> import { ref, watch, computed } from vue// 状态管理 const files ref([]) // 存储…

CPP学习之map和set

1. 关联式容器 在之前博客中我们提到过序列式容器&#xff1a;vector, list, deque, forward_list等&#xff0c;其底层都是线性数据结构。 关联式容器存储的是键值对–<key, value>&#xff0c;与序列式容器仅存储值–key不一样&#xff0c;在数据检索时比序列式容器效…

深入理解C++中的移动赋值与拷贝赋值函数——兼论移动构造函数及其实际应用场景

技术博客&#xff1a;深入理解C中的移动赋值与拷贝赋值函数——兼论移动构造函数及其实际应用场景引言在C编程中&#xff0c;对象的赋值和构造操作是常见的需求。随着C11标准的引入&#xff0c;移动语义&#xff08;Move Semantics&#xff09;成为提升程序性能的重要手段之一。…

免费在线图片合成视频工具 ,完全免费

免费在线图片合成视频工具 &#xff0c;完全免费 免费在线图片合成视频工具是一个完全免费的图片生成视频网站、图片和音乐合成视频网站。 它完全免费&#xff0c;无需注册登录&#xff0c;可以轻松将多张图片转换为视频&#xff0c;支持 jpeg 、png 、webp 格式图片&#xf…

金仓数据库 V9 体验测评:AI 时代国产数据库 “融合” 架构的真实观察

【非广告声明】本文为本人基于金仓数据库 V9 的真实部署测试与技术拆解&#xff0c;无任何商业合作背景&#xff0c;未接受品牌方任何形式的推广委托或费用支持。写作核心是分享国产数据库在 “融合架构”“AI 赋能”“平滑迁移” 等关键场景下的实际使用体验 —— 包括技术细节…

EE进阶1:Maven和SpringBoot基本介绍

Maven什么是mavenMaven简单的理解就是一个项目管理工具&#xff0c;使用pom.xml文件进行管理和获取.jar包&#xff0c;而不用手动进行添加.jar包。创建maven项目以及使用Maven的功能非常多&#xff0c;这里主要理解Maven的项目创建和依赖管理。项目创建&#xff1a;maven本身是…

【系统架构设计(三)】系统工程与信息系统基础下:企业信息化与电子商务-数字化转型的核心驱动力

文章目录一、信息化的基本概念1、 信息化的定义与目的2、 信息化涉及的三大创新3、信息化需求的三个层次二、企业信息化六大方法体系三、信息系统战略规划方法1、 战略规划方法的演进2、 关键成功因素法&#xff08;CSF&#xff09;3、 战略集合转化法&#xff08;SST&#xff…

分布式2PC理论

目录 什么是分布式 2PC&#xff08;Two-Phase Commit&#xff09; 2PC 的工作原理 2PC 的优缺点 为什么 2PC 不完全可靠&#xff1f; 超时问题 协调者故障 什么是分布式 2PC&#xff08;Two-Phase Commit&#xff09; 定义 2PC 是一种原子提交协议&#xff0c;用…

【原创】PDF一键导出图片多张图片一键合成PDF

一、界面功能介绍&#xff1a;PDF输出图片和图片合成PDF二合一 开发动力&#xff1a;WPS有此功能需要VIP收费&#xff0c;其他小软件不能满足我的要求 依赖&#xff1a;友好界面组件&#xff0c;pdf输出图片组件&#xff0c;合并组件 NET8.0&#xff08;NetCore.Winform&#x…

卷积神经网络项目:基于CNN实现心律失常(ECG)的小颗粒度分类系统

卷积神经网络项目实现文档 1、项目简介 1.1 项目名称 ​ 基于CNN实现心律失常&#xff08;ECG&#xff09;的小颗粒度分类系统 1.2 项目简介 ​ 心律失常是临床上常见且潜在致命的心血管疾病之一&#xff0c;包括房性早搏&#xff08;PAC&#xff09;、室性早搏&#xff0…

Linux(1)|入门的开始:Linux基本指令

一、浅谈操作系统1、操作系统是什么&#xff1f;操作系统是一款做软硬件管理的软件我们可以发现除了上面的应用软件&#xff0c;操作系统、设备驱动和硬件都是为软硬件服务的&#xff0c;为了满足用户的不同需求&#xff0c;在操作系统之上需要有各种不同的应用软件。2、一个好…

基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统

1 系统功能介绍 本设计为 基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统。系统以STM32F103C8T6单片机作为核心控制器&#xff0c;结合土壤湿度传感器、OLED液晶显示模块、WiFi模块、继电器驱动电路以及按键电路&#xff0c;实现了土壤湿度的实时采集、显示与远程控…

GooglePlay提审问题记录

1、debug签名问题 原因&#xff1a; 为应用签名 | Android Studio | Android Developers 从 IDE 中运行或调试您的项目时&#xff0c;Android Studio 会自动使用由 Android SDK 工具生成的调试证书为您的应用签名。当您首次在 Android Studio 中运行或调试项目时&#xff…