【并发编程之线程池】

Java并发编程—线程池 java并发编程,线程池 阅读详情

一、线程池(ThreadPoolExecutor)

1.线程池解决的不是多线程,而是系统稳定性

不用线程池的本质风险:

  • 线程 = JVM +OS资源(栈内存、TCB)
  • new Thread()是无上限的资源申请
  • 高并发下,频繁上下文切换,系统load飙升,最终OOM / Full GC / 服务雪崩

线程池可以在吞吐量、响应时间、资源消耗之间做平衡

2.ThreadPoolExecutor 内部结构(不是参数层)

2.1 内部三要素

1. Worker(线程封装)
2. ctl(原子状态 + 线程数)
3. 阻塞队列(任务容器)

2.2 ctl

AtomicInteger ctl;
// 高 3 位:线程池状态
// 低 29 位:线程数量

2.3 线程池状态流转

RUNNING → SHUTDOWN → STOP → TIDYING → TERMINATED

2.4 shutdown() 和 shutdownNow() 的区别

  • shutdown:不接新任务,执行完队列
  • shutdownNow:中断线程,丢弃队列

2.5 线程池核心参数

ThreadPoolExecutor(
    corePoolSize, //核心线程数
    maximumPoolSize, //最大线程数
    keepAliveTime, //非核心线程存活时间,超时没调用就释放
    TimeUnit, //超时单位
    BlockingQueue<Runnable>, //任务队列
    ThreadFactory, //线程工厂
    RejectedExecutionHandler //拒绝策略
)

3.任务提交流程

execute(Runnable command)

精准流程:

  • workerCount < corePoolSize -> 创建核心线程
  • 否则进入队列workQueue.offer
  • 如果队列满了,workerCount < max ,创建非核心线程
  • 如果仍然失败,触发拒绝策略RejectedExecutionHandler

注意:核心线程默认不回收

4.队列选型

队列特点场景
ArrayBlockingQueue有界稳定流量
LinkedBlockingQueue)可无界不可高并发
SynchronousQueue不存任务CachedThreadPool
PriorityBlockingQueue优先级调度系统

5.线程池参数怎么“算”

5.1 CPU密集型

线程数 ≈ CPU 核数 + 1

5.2 IO密集型

线程数 ≈ CPU * (1 + IO/CPU)

线上的线程池问题大部分都是因为无界队列 + 默认拒绝策略引起的

二、四大函数式接口

1.函数式接口真正的价值

把行为当成参数传递

2.Consumer - 副作用执行者

消费数据

void accept(T t)
  • 无返回值
  • 通常用于:日志、IO、更新状态

3.Supplier - 延迟对象创建

生成数据

T get()

常用于:

  • 缓存懒加载
  • 对象池
  • 默认值提供

4.Function - 转换器

R apply(T t)
  • map的底层
  • DTO <-> VO转换核心

5.Predicate - 条件抽象

判断

boolean test(T t)
  • filter的本质
  • 策略模式 + 责任链

示例:

Supplier<String> s = () -> "hello";
Consumer<String> c = System.out::println;
Function<Integer, String> f = i -> "num:" + i;
Predicate<Integer> p = i -> i > 10;

6.函数式接口 vs if-else

  • if-else是控制流
  • 函数式接口是数据驱动

三、Stream流式计算

1.Stream不等于forEach简写

Stream 执行模型:

Source → Intermediate Ops → Terminal Op

延迟执行原理:

  • 中间操作不执行
  • 终止操作触发整个链路

2.内部原理

Spliterator + Pipeline

  • 拆分数据
  • 串联操作
  • 一次遍历完成

3.为什么stream不能复用

状态被消费,和iterator类似

示例:

list.stream()
    .filter(x -> x > 10)
    .map(x -> x * 2)
    .collect(Collectors.toList());

4.特点

  • 懒惰执行
  • 不存储数据
  • 不可复用
  • 内部迭代

5.并行流

list.parallelStream()
  • 使用ForkJoinPool.commonPool
  • 不适合I/O
  • 线程安全问题

6.应用场景

  • 数据过滤、统计
  • 聚合分析
  • 报表计算

四、ForkJoin & 异步回调(CompletableFuture)

1.ForkJoin 框架

核心思路:分治

RecursiveTask<V>
RecursiveAction
  • 工作窃取(Work-Stealing)
  • 适合CPU密集型任务

2.CompletableFuture

CompletableFuture.supplyAsync(() -> queryDB())
    .thenApply(data -> convert(data))
    .thenAccept(System.out::println)
    .exceptionally(e -> null);

1.常见API

  • thenApply(转换)
  • thenAccept(消费)
  • thenCombine(合并)
  • allOf / anyOf

2.应用场景

  • 并行RPC
  • 异步聚合接口
  • 提升接口RT

五、泛型

1.作用

  • 类型安全
  • 消除强转
  • 提升可读性

2.泛型边界

<T extends Number>
<T super Integer>

PESC原则
Producer Extends,Consumer Super

3.类型擦除

  • 编译期泛型
  • 运行期被擦除
  • 通过反射无法获取泛型真实类型(除非父类)

4.应用场景

  • 集合
  • DAO层
  • 通用返回体

六、反射

1.作用

  • 创建对象
  • 调用方法
  • 操作字段
  • 读取注解
Class<?> clazz = Class.forName("User");
Object obj = clazz.getDeclaredConstructor().newInstance();

优点:动态、解耦
缺点:性能差、不安全
场景:Spring IOC、AOP、ORM框架(mybatis)

七、枚举

1.本质

  • enum是final class
  • 每个枚举是单例

2.枚举 + 策略模式

enum OrderStatus {
    CREATED { void handle() {} },
    PAID { void handle() {} }
}

场景

  • 状态机
  • 错误码
  • 常量代替

总结

1.为什么不推荐 Executors?

内部线程数或队列无界,存在 OOM 风险,生产环境应自定义线程池。

2.Stream 和 for 循环区别?

Stream 是声明式、惰性执行、支持并行,但调试性较差。

3.CompletableFuture 和 Future 区别?

Future 只能阻塞 get,CompletableFuture 支持回调、组合、异常处理。

4.泛型为什么运行期不可见?

Java 使用类型擦除实现泛型,保证向下兼容。

5.枚举为什么线程安全?

JVM 保证枚举实例在类加载阶段初始化,天然单例。

Java实现并发编程中的线程池管理! 🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 阅读详情

相关推荐

为师妹写的《Java并发编程之线程池十八问》被表扬啦!

所谓 线程池,就是一个可以管理若干线程的容器,当有任务需要处理时,会提交到线程池的任务队列中,由线程池分配空闲的线程处理任务,处理完任务的线程不会被销毁,而是在线程池中等待下一个任务。

JavaBuild的博客 1374

《Java 并发编程》线程池

《Java 并发编程》线程池🚀1. 自定义线程池🚀2. ThreadPoolExecutor🚁2.1 线程池状态🚁2.2 构造方法🚁2.3 newFiexedThreadPool🚁2.4 newCachedThreadPool🚁2.5 newSingleThreadExecutor🚀3. 提交任务🚀4. 关闭线程池🚀5. 任务调度线程池 🚀1. 自定义线程池 阻塞队列中维护了由主线程(或者其他线程)所产生的的任务 主线程类似于生产者,产生任务并放入阻塞队列中 线程池类似于消费者,得到阻塞队列中已有的任务

华仔仔的博客 2596

使用C++的线程池进行并发编程

线程池是一种并发设计模式,它维护了一个线程集合,这些线程可以被复用来执行任务。当我们向线程池提交一个任务时,线程池会选择一个空闲的线程来执行这个任务。当任务完成后,线程会返回到线程池,等待下一个任务。线程池的主要优点是可以减少创建和销毁线程的开销,提高程序的性能。此外,线程池还可以限制程序中的并发线程数量,防止过多的线程耗尽系统资源。

夏天的狂风的专栏 352

并发编程--线程池

一个基本事实是,线程的创建和销毁都是需要额外的系统资源的,如果线程的生命周期很短,那么相对于实际干活的时间,来回重复创建和销毁就显得很不划算,但也不能让线程执行完任务之后耗着不走,因此就需要一个比较科学合理的布局,来管控线程,一个比较成熟的方案是:在上述情况下,将线程放入一个类似缓冲区的。线程池的基本想法,是将许多线程,放置一个池子中(实际就一个结构体),只要有任务,就将任务投入池中,这些线程们通过某些机制,及时处理这些任务。而任务都被放入一个链表,被互斥锁保护起来。

m0_74147998的博客 1540

Delphi开发者必备:CEF4Delphi跨平台浏览器嵌入实战指南(含Lazarus适配)

本文详细介绍了Delphi开发者如何利用CEF4Delphi实现跨平台浏览器嵌入,包括环境配置、Lazarus适配、ARM架构优化及Firemonkey集成等实战技巧。通过Chromium引擎的强大功能,开发者可以轻松为传统桌面应用添加现代浏览器特性,提升多平台开发效率。

weixin_29233333的博客 226

FPGA调试利器:VIO与ILA在Vivado中的实战应用指南

本文详细介绍了Vivado中FPGA调试工具VIO与ILA的实战应用技巧。VIO作为虚拟输入/输出工具,可实时调整参数;ILA作为集成逻辑分析仪,能高效捕获内部信号。文章通过具体案例展示了如何配置ILA采样深度、触发条件,以及VIO的动态参数调整功能,帮助开发者提升上板调试效率,解决常见通信失败、数据不同步等问题。

weixin_42553471的博客 424

并发编程高频八股——线程池

大家好,我是钢板兽! 今天继续更新并发编程的第二篇高频八股——线程池,包括线程池的作用、创建线程池的方式、线程池的参数以及核心参数的设置。 本文的八股在对线程池的理解上比较浅显,创建线程池的方式和核心参数的设置,建议大家可以去实现一个动态线程池的demo或者复现开源项目,这样会加深对线程池的理解。

weixin_49426115的博客 1021

【ANSYS Workbench仿真】命令流:压力渗透pressure penetration

对与流体接触的part添加边界压力,使流体压力渗透点的接触应力与流体压力相等,以便得到真实的变形结果,就需要用到“pressure penetration”。 但是在ansys中,只能通过ADPL的形式添加,即在workbench中添加命令流的形式。此文主要介绍了**压力渗透的添加要点**和**命令流使用说明**。

路边小M's Blog 1万+

并发编程-线程池原理与实战

AbstractExecutorService是一个抽象类,它实现了ExecutorService接口。AbstractExecutorService存在的目的是为ExecutorService中的接口提供默认实现。//......

洛晓关的博客 1205

Python编程基础05:运算符与表达式

文章目录一、算术运算符1、分类说明表2、注意事项3、案例演示任务1、计算成绩差与平均成绩课堂练习:编程处理带余除法。任务2、打印购物小票 运算符就是专门用于告诉程序执行特定运算或逻辑操作的符号。表达式是指由常量、变量和运算符组成的一个算式。编写程序对数据进行处理,其实处理就是对数据实施各种各样的运算,搞懂运算符与表达式是我们编写程序的基础性工作,本次讲课笔记通过案例讲解各种运算符的用法以及正确书写Python表达式的注意事项。 一、算术运算符 Python中的算术运算符就是用来处理四则运算的符号,也是

howard2005的专栏 3119

喷涂机器人系列编程:ABB IRB 5500_(2).ABB IRB 5500喷涂机器人系统架构与组件

ABB IRB 5500喷涂机器人系统不仅在性能上表现出色,而且在安全和维护方面也提供了全面的解决方案。通过本文的详细介绍,希望读者能够更好地理解和掌握这一系统的架构和功能,为实际应用提供有力支持。

zhubeibei168的博客 778

并发编程——线程池

线程池

新入坑的嵌入式的小白 466

SPICE仿真软件:PSpice_(10).噪声分析

噪声分析是电路设计和优化中的一个重要工具,特别是在低噪声放大器、传感器电路和通信电路中。通过准确设置噪声源和仿真参数,合理选择频率范围,并验证仿真结果,可以有效地评估和优化电路的噪声性能。PSpice提供的噪声分析功能强大且灵活,能够帮助工程师和研究人员在多种应用场景下进行详细的噪声分析。

kkchenjj的博客 1536

Java并发编程一四种常用线程池简述

Java并发编程一四种常用线程池简述 我们使用线程是用来执行任务的,所以,首先我们得有一个任务,这里我们定义线程的任务很简单,就是输出自己(当前线程)的name,为了方便观察,每个线程的执行逻辑中sleep(500)。 任务 Task类,实现了Runnable接口。 package threadpool; class Task implements Runnable { @Overri...

kaven 1107

零基础入门红外与可见光图像融合:DAF-Net 实战全指南

本文介绍了基于DAF-Net的红外与可见光图像融合技术,主要内容包括:技术原理、环境配置、数据准备和模型实现。DAF-Net通过双分支特征提取和动态注意力融合机制,有效结合红外图像的热辐射信息与可见光图像的纹理细节。文章详细讲解了开发环境搭建步骤(Python 3.8+PyTorch),TNO数据集的预处理方法,并提供了完整的DAF-Net实现代码,包含特征提取、注意力融合和图像重建三个关键模块。该技术可广泛应用于安防监控、自动驾驶等领域,帮助开发者快速入门多模态图像融合。

FJN110的博客 123

杰理JL703N的SDK内部MIDI 音色库功能使用教程

本文介绍了MIDI琴按键解码和MIDI文件解码的实现方法。MIDI琴解码通过audio_dec_midi_ctrl.c文件实现,MIDI文件(mfa格式)解码则使用audio_dec_midi_file.c。使用前需将音色文件存放在SD卡或内置flash中(需确保四字节对齐),并在download.c中配置路径。同时需在板级配置中将FLASH设置为16Mbit以解决编译问题。关键注意事项包括音色文件的文件夹结构对齐要求和MIDI数据流的正确配置。

qq_42014563的博客 390

并发编程之线程池ThreadPoolExecutor

当前线程数达到maxinumPoolSize时,新的任务会被采用拒绝策略处理 构造方法中handler参数是指定拒绝策略 AbortPolicy:抛出异常 CallerRunsPolicy:线程池未关闭 -> 在调用者线程中运行当前任务(如任务在main线程中,就由main线程去执行) DiscardOlddestPolicy:丢弃等待时间最长的任务DiscardPolicy:直接丢弃,不做处理 使用new创建的新对象,将引用指向一个变量,该变量是指向新对象的一个强引用 只要强引用对象是可触及的->就

lanleihhh的博客 406

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java并发编程面试必备:如何创建线程池、线程池拒绝策略

本文介绍了Java中的线程池及其在高并发编程中的应用,重点解析了ThreadPoolExecutor的核心参数配置、线程池类型选择及适用场景。文章探讨了常见的线程池拒绝策略,包括AbortPolicy和CallerRunsPolicy,并分析了它们在应对系统过载时的效果。此外,文章提供了20个常见面试问题及其详尽解答,涵盖了线程池的工作机制、任务队列、线程复用、异常处理与监控等关键知识点,为面试者提供了全面的复习指导,以帮助其在并发编程面试中表现出色。

程序员-杨胡广的博客 2261

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

并发编程之线程池:八股讲解

Java八股是程序员面试和进阶的必备技能。本专栏旨在每篇文章通过一个八股问题深入钻研,并引申出其相关联的知识点,方便记忆。本文介绍并发编程中的线程池。

AkimotoManatsu的博客 903

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java并发编程实战:线程池、锁和原子操作

文章标题:《Java并发编程实战:线程池、锁和原子操作》 摘要:本文深入探讨了Java并发编程的核心主题——线程池、锁和原子操作。通过生动的比喻和生活实例,我们介绍了这些概念的应用场景和实战技巧。线程池像一个智能的结账系统,提高了任务处理的效率;锁确保了数据的一致性和完整性;原子操作则保证了并发环境下的安全性和准确性。掌握这些技术,可以让我们编写出高性能、高可靠性的并发程序。

silenceallat的博客 995

深入理解Java中的线程池和并发编程

并发编程是指同时执行多个任务的编程技术。在Java中,并发编程可以通过多线程实现。多线程编程能够提高应用程序的响应速度和资源利用率,但也带来了线程管理和同步的问题。为了解决这些问题,Java提供了强大的并发工具库,其中线程池是最常用的工具之一。

微赚淘客系统开发者博客 953

并发编程——CompletableFuture + 线程池

CompletableFu‏ture 默认使用 Java 7 引入的线程池来并发执行任务。该线程池特​别适合需要分治法来处理的大量并发任务,支持递归任‌务拆分。Java 8 中的并行流默认也是使用了 Fo‏rkJoinPool 进行并发处理。工作窃取算法(Work-Stealing):线程可以从其他线程的工作队列中“窃取”任务,以提高 CPU 的使用率和程序的并行性。递归任务处理:支持将大任务拆分为多个小任务并行执行,然后再将结果合并。但是要注意!!!

cui_hao_nan的博客 810

【面试突击】并发编程、线程池面试实战

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列笔记和编程高频电子书! 文章导读地址:点击查看文章导读! 感谢你的关注!

qq_45260619的博客 1338

Java并发编程-线程池

是一种并发编程技术,用于管理一组线程,以便复用这些线程来执行多个任务。使用线程池的核心目的就是用来减少线程的创建和销毁的开销,从而能提高系统的响应性能,同时线程池对线程的管理也能避免线程创建过多导致内存溢出。

qq_55342245的博客 783

17.并发编程--线程池

并发编程线程池 合理利用线程池能够带来三个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必...

alibb20000的博客 133

Java 开发中的并发编程:理解线程与线程池

通过合理地使用线程池来管理线程,使用并发工具类来控制线程间的协调与同步,可以提升系统的响应能力和可伸缩性。并发编程是 Java 开发中的一个重要技能,它涉及线程的创建、管理、同步工具类的使用等多个方面。线程池可以有效地减少创建和销毁线程的开销,并且能够控制并发线程的数量,避免系统过载。本文将介绍 Java 并发编程的基础知识,包括线程的创建、管理、线程池的使用、以及常见的并发工具类,帮助开发者提升多线程编程技能,优化应用性能。在上面的代码中,我们创建了一个固定大小为 3 的线程池,并提交了 5 个任务。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 898
上一篇: 【JUC 并发编程】
下一篇: 【JUC/JMM 并发核心体系】
kian.wqn
博客等级 码龄6年 11粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值