java线程池原理及使用和处理流程
实际测试使用如下:
package com.study;import java.util.concurrent.*;/*** 线程池作用:* 1、线程的复用* 2、资源管理* 3、任务调度* --------------执行过程--------------* 第1-3个任务进来时,直接创建任务并执行* 第4-8个任务进来时,会把新任务放到队列,然后按照顺序执行队列中的任务,新的任务在队列最后* 第9-15个任务进来时,会先执行队列中已有的任务,再执行新的任务* 第16个任务进来时,会执行拒绝策略** @author admin* @since 2025-04-18 15:48*/
public class ThreadPoolDemo {// 核心线程数private static final int CORE_POOL_SIZE = 3;// 最大线程数private static final int MAX_POOL_SIZE = 10;// 空闲线程存活时间private static final long KEEP_ALIVE_TIME = 5;// 时间单位private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;// 队列容量private static final int QUEUE_SIZE = 10;/*** 任务队列* 1、ArrayBlockingQueue 有界队列,通用队列,线程池的默认队列* 2、LinkedBlockingQueue 无界队列,默认大小为Integer.MAX_VALUE* 3、SynchronousQueue 无容量队列,不存储任务,直接提交给线程池处理* 4、PriorityBlockingQueue 优先级队列,线程池的默认队列* 5、DelayQueue 延迟队列*/static ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(QUEUE_SIZE);/*** 拒绝策略* 1、abortPolicy 直接抛出异常(默认)* 2、discardPolicy 直接丢弃任务* 3、discardOldestPolicy 踢出队列中最老的任务,再次提交当前任务* 4、callerRunsPolicy 由提交任务的线程来执行任务*/static final RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();/*** 线程工厂*/static final ThreadFactory threadFactory = new CustomThreadFactory(Thread.NORM_PRIORITY, false);/*** 传统线程池创建* 场景:不同业务线需隔离资源(如支付交易与普通查询互不影响)*/private static final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, queue, threadFactory, handler);/*** 1、固定-线程池创建* 默认核心线程数和最大线程数相同* 默认空闲线程存活时间为0s* 默认LinkedBlockingQueue无界队列* 默认拒绝策略和默认线程工厂* 场景:短时涌入大量HTTP请求(如电商秒杀、票务系统),需快速响应且避免服务器崩溃*/private static final ExecutorService fixedExecutor = Executors.newFixedThreadPool(3);/*** 2、缓存-线程池创建* 默认核心线程数0,所有线程均为非核心线程* 最大线程数为Integer最大值* 默认空闲线程存活时间60s* 使用SynchronousQueue无容量队列,不存储任务,直接提交给线程池处理* 默认拒绝策略和默认线程工厂* 场景:主线程需快速返回,耗时操作异步执行(如发送邮件、生成报表)*/private static final ExecutorService cachedExecutor = Executors.newCachedThreadPool();/*** 3、任务-线程池创建* 最大线程数为Integer最大值* 默认空闲线程存活时间0s* 默认DelayedWorkQueue高性能队列* 默认拒绝策略和默认线程工厂* 场景:定时执行任务(如每日数据备份、定期推送消息)*/private static final ExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);/*** 4、单线程-线程池创建* 核心线程数和最大线程数都为1* 默认空闲线程存活时间0s* 默认LinkedBlockingQueue无界队列* 默认拒绝策略和默认线程工厂* 场景:跨服务任务调度(如分布式锁续期、集群状态同步)*/private static final ExecutorService singleExecutor = Executors.newSingleThreadExecutor();/*** 5、并行-线程池创建* 并行级别(默认 CPU 核心数)* 场景:多核CPU任务并行执行(如并行计算、并行处理),海量数据分片并行处理(如日志分析、图像渲染)、递归任务分解*/private static final ExecutorService workExecutor = Executors.newWorkStealingPool();/*** 测试*/public static void main(String[] args) throws InterruptedException {String type = "fixed";String returnType = "test";ExecutorService executorService = getExecutorService(type);for (int i = 0; i < 10; i++) {executeTask(executorService, i, returnType);}// 等待任务执行完成关闭线程池executorService.shutdown();// 添加等待终止逻辑(确保任务完成)if (!executorService.awaitTermination(30, TimeUnit.SECONDS)) {System.err.println("线程池未在限定时间内关闭");}}/*** 线程池执行任务*/private static void executeTask(ExecutorService executorService, int taskId, String returnType) {// 根据返回值判断是否执行成功if (("wait").equals(returnType)) {Future<String> future = getFuture(executorService, taskId);// 方法1:最大等待30sgetFutureResultWait(future, taskId);} else if (("while").equals(returnType)) {FutureTask<String> future = getFutureTask(executorService, taskId);// 方法2:轮询判断是否执行完成getFutureResultWhile(future, taskId);} else {// 方法3:异步获取返回值CompletableFuture<Integer> futureWithExecutor = CompletableFuture.supplyAsync(() -> {System.out.println(taskId + "\t" + Thread.currentThread().getName());return taskId;}, executorService);// 添加上述异步回调处理futureWithExecutor.whenComplete((result, ex) -> {if (ex != null) {System.err.println("Task " + taskId + " failed: " + ex.getMessage());} else {System.out.println("Task " + taskId + " completed: " + result);}});}}/*** 提交异步任务并返回Future对象** @param executorService 线程池执行器,用于提交异步任务* @param taskId 任务标识符,用于日志跟踪* @return Future<String> 表示异步计算的结果对象*/private static Future<String> getFuture(ExecutorService executorService, int taskId) {return executorService.submit(() -> {// 任务执行逻辑:打印线程信息并模拟耗时操作System.out.println(taskId + "\t" + Thread.currentThread().getName());try {Thread.sleep(1000);return "OK";} catch (InterruptedException e) {// 正确的中断处理:恢复中断状态并记录日志Thread.currentThread().interrupt();System.out.println("Task interrupted: " + taskId);return "ERROR";}});}/*** 提交异步任务并返回FutureTask对象** @param executorService 线程池执行器,用于提交异步任务* @param taskId 任务标识符,用于日志跟踪* @return FutureTask<String> 表示异步计算的结果对象*/private static FutureTask<String> getFutureTask(ExecutorService executorService, int taskId) {// 创建Callable任务Callable<String> task = () -> {// 任务执行逻辑:打印线程信息并模拟耗时操作System.out.println(taskId + "\t" + Thread.currentThread().getName());try {Thread.sleep(1000);return "OK";} catch (InterruptedException e) {// 正确的中断处理:恢复中断状态并记录日志Thread.currentThread().interrupt();System.out.println("Task interrupted: " + taskId);return "ERROR";}};/** 创建FutureTask实例以包装异步任务* @param task 需要执行的Callable/Runnable任务对象* FutureTask兼具Runnable和Future的特性:* 1. 可作为Runnable被线程池执行* 2. 通过Future接口方法获取计算结果*/FutureTask<String> futureTask = new FutureTask<>(task);/** 将FutureTask提交到线程池执行* @param futureTask 包装了任务的可执行对象* 提交后会立即返回,实际执行由线程池调度* 后续可通过futureTask.get()阻塞获取计算结果* 或通过futureTask.cancel()取消任务*/executorService.submit(futureTask);return futureTask;}/*** 阻塞等待Future结果并处理超时** @param future 异步任务Future对象* @param taskId 任务标识符,用于异常日志*/private static void getFutureResultWait(Future<String> future, int taskId) {try {// 设置最长等待时间为10秒String result = future.get(5, TimeUnit.SECONDS);System.out.println("Task result: " + result);} catch (InterruptedException | ExecutionException e) {// 中断处理:恢复中断状态并记录日志Thread.currentThread().interrupt();System.out.println("Task interrupted: " + taskId);} catch (TimeoutException e) {// 超时处理:主动取消任务并记录日志future.cancel(true);System.out.println("Task timeout: " + taskId);}}/*** 轮询检查任务完成状态** @param future 异步任务Future对象* @param taskId 任务标识符,用于中断日志*/private static void getFutureResultWhile(Future<String> future, int taskId) {String result = "ERROR";// 轮询机制检查任务状态while (!future.isDone()) {System.out.println("任务仍在执行中...");try {// 降低轮询频率以避免CPU过载Thread.sleep(500);result = "OK";} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("Task interrupted: " + taskId);// 立即退出循环break;}}System.out.println("Task result: " + result);}/*** 获取不同类型的线程池*/private static ExecutorService getExecutorService(String type) {switch (type) {case "fixed":return fixedExecutor;case "cached":return cachedExecutor;case "scheduled":return scheduledExecutor;case "single":return singleExecutor;case "work":return workExecutor;default:return poolExecutor;}}
}
自定义线程工厂
package com.study;import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;/*** 自定义线程工厂** @author admin* @since 2025-04-18 17:29*/
public class CustomThreadFactory implements ThreadFactory {// 编号从1开始private final AtomicInteger number = new AtomicInteger(1);private static final String NAME_PREFIX = "pool-thread-";// 线程优先级private final int priority;// 是否守护线程private final boolean daemon;/*** 默认构造方法,创建普通优先级、非守护线程*/public CustomThreadFactory() {this(Thread.NORM_PRIORITY, false);}/*** 构造方法,自定义优先级和是否守护线程** @param priority 优先级* @param daemon 是否守护线程*/public CustomThreadFactory(int priority, boolean daemon) {if (priority < Thread.MIN_PRIORITY || priority > Thread.MAX_PRIORITY) {throw new IllegalArgumentException("优先级超出范围: " + priority);}this.priority = priority;this.daemon = daemon;}/*** 创建线程** @param r 线程任务* @return 线程对象*/@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r);thread.setName(NAME_PREFIX + number.getAndIncrement());thread.setPriority(priority);thread.setDaemon(daemon);thread.setUncaughtExceptionHandler((t, e) -> {System.err.println("线程 " + t.getName() + " 发生异常: " + e);e.printStackTrace();});return thread;}
}
相关文章:
java线程池原理及使用和处理流程
实际测试使用如下: package com.study;import java.util.concurrent.*;/*** 线程池作用:* 1、线程的复用* 2、资源管理* 3、任务调度* --------------执行过程--------------* 第1-3个任务进来时,直接创建任务并执行* 第4-8个任务进来时&…...
用 NLP + Streamlit,把问卷变成能说话的反馈
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
TCP/IP和UDP协议的发展历程
TCP/IP和UDP协议的发展历程 引言 互联网的发展史是人类技术创新的辉煌篇章,而在这一发展过程中,通信协议发挥了奠基性的作用。TCP/IP(传输控制协议/互联网协议)和UDP(用户数据报协议)作为互联网通信的基础…...
Function Calling的时序图(含示例)
🧍 用户: 发起请求,输入 prompt(比如:“请告诉我北京的天气”)。 🟪 应用: 将用户输入的 prompt 和函数定义(包括函数名、参数结构等)一起发给 OpenAI。 …...
DICOM通讯(ACSE->DIMSE->Worklist)
DICOM 通讯协议中的 ACSE → DIMSE → Worklist 这条通讯链路。DICOM 通讯栈本身是一个多层的协议结构,就像 OSI 模型一样,逐层封装功能。 一、DICOM 通讯协议栈总体架构 DICOM 通讯使用 TCP/IP 建立连接,其上面封装了多个协议层次…...
若依框架修改左侧菜单栏默认选中颜色
1.variables.sacc中修改为想要的颜色 2.给目标设置使用的颜色...
搜广推校招面经七十八
字节推荐算法 一、实习项目:多任务模型中的每个任务都是做什么?怎么确定每个loss的权重 这个根据实际情况来吧。如果实习时候用了moe,就可能被问到。 loss权重的话,直接根据任务的重要性吧。。。 二、特征重要性怎么判断的&…...
广搜bfs-P1443 马的遍历
P1443 马的遍历 题目来源-洛谷 题意 要求马到达棋盘上任意一个点最少要走几步 思路 国际棋盘规则是马的走法是-日字形,也称走马日,即x,y一个是走两步,一个是一步 要求最小步数,所以考虑第一次遍历到的点即为最小步数ÿ…...
强化学习算法系列(六):应用最广泛的算法——PPO算法
强化学习算法 (一)动态规划方法——策略迭代算法(PI)和值迭代算法(VI) (二)Model-Free类方法——蒙特卡洛算法(MC)和时序差分算法(TD) (三)基于动作值的算法——Sarsa算法与Q-Learning算法 (四…...
Vue3 + TypeScript中provide和inject的用法示例
基础写法(类型安全) typescript // parent.component.vue import { provide, ref } from vue import type { InjectionKey } from vue// 1. 定义类型化的 InjectionKey const COUNTER_KEY Symbol() as InjectionKey<number> const USER_KEY Sy…...
AI Agents系列之AI代理架构体系
1. 引言 智能体架构是定义智能体组件如何组织和交互的蓝图,使智能体能够感知其环境、推理并采取行动。本质上,它就像是智能体的数字大脑——集成了“眼睛”(传感器)、“大脑”(决策逻辑)和“手”(执行器),用于处理信息并采取行动。 选择正确的架构对于构建有效的智能…...
3个实用的脚本
1. Linux 系统清理临时文件脚本 该脚本用于清理系统中 /tmp 目录下超过 7 天的临时文件。 #!/bin/bash# 清理 /tmp 目录下超过 7 天的文件 find /tmp -type f -atime 7 -exec rm -f {} \;# 清理 /var/tmp 目录下超过 7 天的文件 find /var/tmp -type f -atime 7 -exec rm -f {…...
2025海外代理IP测评:Bright Data,ipfoxy,smartproxy,ipipgo,kookeey,ipidea哪个值得推荐?
近年来,随着全球化和跨境业务需求的不断扩大“海外代理IP”逐渐成为企业和个人在多样化场景中的重要工具。无论是进行数据采集、广告验证、社交媒体管理,还是跨境电商平台运营,选择合适的代理IP服务商都显得尤为重要。然而,市场上…...
条款13:以对象管理资源
什么是资源?内存?没错但是内存只是我们需要管理众多资源的一种,资源还包括数据的连接,文件描述符,互斥锁,网络套接字,不管哪种资源他都是从系统中获取的,当你不在需要他的时候是要还…...
Android守护进程——Vold (Volume Daemon)
简介 介绍:Vold 是用来管理 android 系统的存储设备,如U盘、SD卡、磁盘等移动设备的热插拔、挂载、卸载、格式化 框架结构:Vold 在系统中以守护进程存在,是一个单独的进程。处于Kernel和Framework之间,是两个层级连接…...
vue3+vite 实现.env全局配置
首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖: pnpm install dotenv --save-dev 引入完成后,在vite.config.js配置文件内加入以下内容: const env dotenv.config({ path: ./.env }).parsed define: { // 将…...
AI 组件库是什么?如何影响UI的开发?
AI组件库是基于人工智能技术构建的、面向用户界面(UI)开发的预制模块集合。它们结合了传统UI组件(如按钮、表单、图表)与AI能力(如机器学习、自然语言处理、计算机视觉),旨在简化开发流程并增强…...
【AI模型学习】关于写论文——论文的审美
文章目录 一、“补丁法”(Patching)1.1 介绍1.2 方法论1.3 实例 二、判断工作的价值2.1 介绍2.2 详细思路2.3 科研性vs工程性 三、novelty以及误区3.1 介绍3.2 举例 看了李沐老师的读论文系列后,总结三个老师提到的有关课题研究和论文写作的三…...
OpenCV day6
函数内容接上文:OpenCV day4-CSDN博客 , OpenCV day5-CSDN博客 目录 平滑(模糊) 25.cv2.blur(): 26.cv2.boxFilter(): 27.cv2.GaussianBlur(): 28.cv2.medianBlur(): 29.cv2.bilateralFilter(): 锐…...
AI的出现,是否能替代IT从业者?
一、技术能力的边界:AI 能做什么? 自动化基础任务 代码生成:GitHub Copilot、天工 AI 等工具可自动生成 80% 以上的重复性代码,例如根据自然语言描述生成完整的网站前端代码。测试与运维:AI 驱动的测试工具能自动生成测…...
【AI飞】AutoIT入门七(实战):python操控autoit解决csf视频批量转换(有点难,AI都不会)
背景: 终极目标:通过python调用大模型,获得结果,然后根据返回信息,控制AutoIT操作电脑软件,执行具体工作。让AI更具有执行力。 已完成部分: 关于python调用大模型的,可以参考之前的…...
MARA/MARC表 PSTAT字段
最近要开发一个维护物料视图的功能。其中PSTAT字段是来记录已经维护的视图的。这里记录一下视图和其对应的字母。 MARA还有个VPSTA(完整状态)字段,不过在我试的时候每次PSTAT出现一个它就增加一个,不知道具体是为什么。 最近一直…...
《探秘鸿蒙分布式软总线:开启无感发现与零等待传输新时代》
在数字化浪潮中,设备之间的互联互通成为构建智能生态的关键。鸿蒙系统中的分布式软总线技术,宛如一座桥梁,让各种智能设备紧密相连。尤其是其实现的设备间无感发现和零等待传输功能,更是为用户带来了前所未有的便捷体验࿰…...
学习型组织与系统思考
真正的学习型组织不是只关注个人的学习,而是关注整个系统的学习。—彼得圣吉 在这两年里,越来越多的企业开始询问是否可以将系统思考的内容内化给自己的内训师,进而在公司内部进行教学。我非常理解企业这样做的动机,毕竟内部讲师…...
支持mingw g++14.2 的c++23 功能print的vscode tasks.json生成调试
在mingw14.2版本中, print库的功能默认没有开启, 生成可执行文件的tasks.json里要显式加-lstdcexp, 注意放置顺序. tasks.json (支持mingw g14.2 c23的print ) {"version": "2.0.0","tasks": [{"type": "cppbuild","…...
守护者进程小练习
守护者进程含义 定义:守护进程(Daemon)是运行在后台的特殊进程,独立于控制终端,周期性执行任务或等待事件触发。它通常以 root 权限运行,名称常以 d 结尾(如 sshd, crond)。 特性&a…...
opencv函数展示3
一、图像平滑(模糊) 线性滤波(速度快): 1.cv2.blur() 2.cv2.boxFilter() 3.cv2.GaussianBlur() 非线性滤波(速度慢但效果好): 4.cv2.medianBlur() 5.cv2.bilateralFilter() 二、锐…...
环境搭建与入门:Flutter SDK安装与配置
环境搭建与入门:Flutter SDK安装与配置 一、Flutter开发环境概述 1.1 Flutter开发环境组成 Flutter开发环境主要包含以下几个关键组件: Flutter SDK:Flutter的核心开发工具包Dart SDK:Flutter使用的编程语言环境IDE/编辑器&am…...
linux驱动之poll
驱动中 poll 实现 在用户空间实现事件操作的一个主要实现是调用 select/poll/epoll 函数。那么在驱动中怎么来实现 poll 的底层呢? 其实在内核的 struct file_operations 结构体中有一个 poll 成员,其就是底层实现的接口函数。 驱动中 poll 函数实现原…...
遥感技术赋能电力设施监控:应用案例篇
目前主流的电力巡检手段利用无人机能够通过设定灵活航线进行低空飞行、搭载不同的采集设备,能够从不同角度对输电线进行贴近拍摄,但缺陷是偏远山区无人机飞行技术要求高,成本高,且飞行的无人机也可能会对输电线产生破坏。 星图云开…...
