当前位置: 首页 > backend >正文

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、工作窃取-线程池创建* 核心线程数和最大线程数都为1* 默认空闲线程存活时间0s* 默认LinkedBlockingQueue无界队列* 默认拒绝策略和默认线程工厂* 场景:海量数据分片并行处理(如日志分析、图像渲染)*/private static final ExecutorService workExecutor = Executors.newWorkStealingPool();/*** 测试*/public static void main(String[] args) throws InterruptedException {String type = "fixed";ExecutorService executorService = getExecutorService(type);for (int i = 0; i < 10; i++) {executeTask(executorService, i);}// 等待任务执行完成关闭线程池executorService.shutdown();// 添加等待终止逻辑(确保任务完成)if (!executorService.awaitTermination(30, TimeUnit.SECONDS)) {System.err.println("线程池未在限定时间内关闭");}}/*** 线程池执行任务*/private static void executeTask(ExecutorService executorService, int taskId) {executorService.execute(() -> {System.out.println(taskId + "\t" + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {// 正确的中断处理(优化)Thread.currentThread().interrupt();System.out.println("Task interrupted: " + taskId);}});}/*** 获取不同类型的线程池*/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;}
}

http://www.xdnf.cn/news/199.html

相关文章:

  • 隐马尔可夫模型(HMM)与序列标注任务详解
  • hadoop三大组件的结构及各自的作用
  • Python作业4 文本词云统计,生成词云
  • 欣佰特携数十款机器人相关前沿产品,亮相第二届人形机器人和具身智能行业盛会
  • 在国产麒麟Kylin Linux Advanced Server V10中使用QT5开发环境并支持中文输入
  • SimBody安装
  • AI中台系统设计方案探讨
  • CentOS 7系统yum报错解决方案(CentOS 7官方EOL问题修复)
  • 健康养生:开启活力生活新篇章
  • Oracle AWR快照保留策略及其修改
  • mybatis plus打印sql日志到指定目录
  • js前端复制对象
  • 神经接口安全攻防:从技术漏洞到伦理挑战
  • 有什么好用的工程项目施工数据管理信息系统?这类系统有何好处?
  • 麒麟操作系统漏洞修复保姆级教程弱(一)算法漏洞修复
  • 【数据融合实战手册·实战篇】二维赋能三维的5种高阶玩法:手把手教你用Mapmost打造智慧城市标杆案例
  • 重构未来智能:Anthropic 解码Agent设计哲学三重奏
  • Unity-微信截图功能简单复刻-02屏幕采样
  • 青少年编程与数学 02-016 Python数据结构与算法 28课题、图像处理算法
  • 深入理解红黑树:原理、实现与应用
  • openbmb/MiniCPM-V-2_6 和 AIDC-AI/Ovis2-1B 的网络结构体对比
  • 日本公司如何实现B2B商城订货系统的自动化和个性化?
  • 电子电器架构 --- EOL 工厂刷写(产线)
  • Debian服务器环境下env变量丢失怎么办
  • 万物互联时代,AWS IoT Core如何构建企业级物联网中枢平台?
  • UML 状态图:以网络媒体教学系统为例解析
  • Python项目--基于机器学习的股票预测分析系统
  • 路由交换网络专题 | 第五章 | ISIS | RIP | 路由引入 | 策略路由
  • 探索大语言模型(LLM):循环神经网络的深度解析与实战(RNN、LSTM 与 GRU)
  • 工业触摸显示器助力智慧工业实验室发展