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

自定义线程池(二)

上节回顾

在上一节当中,已经实现了一个线程池,在本节当中,我们需要添加拒绝策略。这里使用到了策略模式的设计模式,因为拒绝策略是多种的,我们需要将这个权利下放给调用者(由调用者来指定我要采取哪种策略),而线程池只需要调用拒绝的接口即可。
在这里插入图片描述

步骤

(1)定义拒绝策略接口
(2)在线程池中加入拒绝策略参数
(3)自行调用测试

1.定义接口类

@FunctionalInterface
interface RejectPolicy<T>{//注意传递参数void reject(BlockQueue<T> queue,Runnable task);
}

2.线程池中添加接口以及调用方法

@Slf4j
class ThreadPool {//任务队列private BlockQueue<Runnable> taskQueue;//线程集合 我们需要对线程做一个包装private HashSet<Worker> workers = new HashSet<>();//核心线程数量private long coreSize;//超时时间private long timeout;//时间单位private TimeUnit timeUnit;//自定义拒绝策略private RejectPolicy<Runnable> rejectPolicy;public ThreadPool(int queueCapacity,long coreSize,long timeout,TimeUnit timeUnit){this.taskQueue = new BlockQueue<>(queueCapacity);this.coreSize = coreSize;this.timeout = timeout;this.timeUnit = timeUnit;this.rejectPolicy = (queue, task) -> {throw new RuntimeException();};}public ThreadPool(int queueCapacity,long coreSize,long timeout,TimeUnit timeUnit,RejectPolicy<Runnable> rejectPolicy){taskQueue = new BlockQueue<>(queueCapacity);this.coreSize = coreSize;this.timeout = timeout;this.timeUnit = timeUnit;this.rejectPolicy = rejectPolicy;}//执行任务public void execute(Runnable task){//当任务数量尚未超过coreSizesynchronized (workers){if (workers.size() < coreSize){log.info("创建工作线程{}",task);Worker worker = new Worker(task);workers.add(worker);worker.start();}else{log.info("加入到任务队列{}",task);//有可能会阻塞在这里 进而将主线程阻塞掉//taskQueue.put(task);//这里会有很多种策略自定义策略//策略模式:操作抽象成接口实现代码是传过来不会写死taskQueue.tryPut(rejectPolicy,task);//rejectPolicy.reject(taskQueue,task);}}}class Worker extends Thread{private Runnable task;public Worker(Runnable task){this.task = task;}@Overridepublic void run() {while (task != null || (task = taskQueue.poll(timeout,timeUnit)) != null){try {log.info("正在执行...{}",task);//执行任务task.run();}catch (Exception e){System.out.println(e.getMessage());}finally {//不要忘记这一步task = null;}}synchronized (workers){log.info("worker被移除{}",this);workers.remove(this);}}}
}

3.main测试

@Slf4j
public class TestPool {//阻塞队列是平衡生产者和消费者之间的中介//任务数量超过任务队列的情况public static void main(String[] args) {ThreadPool threadPool = new ThreadPool(10, 2, 1000, TimeUnit.MICROSECONDS, (queue, task) -> {//1.死等queue.put(task);//2.超时等待queue.offer(task, 1500, TimeUnit.MICROSECONDS);//3.调用者自己放弃// log.debug("放弃{}",task);//4.调用者抛异常//throw new RuntimeException("task执行失败" + task);//5.调用者自己执行task.run();});for (int i = 0; i < 20; i++) {int j = i;//主线程可能会在这里阻塞threadPool.execute(() -> {try {Thread.sleep(30000);} catch (InterruptedException e) {throw new RuntimeException(e);}TestPool.log.debug("{}", j);});}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【带你入门生信】什么是生物信息学
  • [Linux安全运维] Nginx安装部署以及LNMP框架搭建保姆级教程
  • 基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)
  • C语言--函数
  • 【dijkstra】迪杰斯特拉算法 洛谷 P1828例题代码讲解
  • C++与云计算的融合:构建高效、可扩展的云服务
  • 逻辑推理之lora微调
  • 2024/8/3 英语每日一段
  • 数据结构与算法 - 堆
  • Halcon 模型变化
  • 题解题解题解题解
  • 《古代希腊赛会研究:能揭开古希腊赛会的神秘面纱吗?》
  • 学习编程的第二十天,加油!
  • 【Android】通知的使用
  • 【java基础】徒手写Hello, World!程序
  • 10个确保微服务与容器安全的最佳实践
  • 11111111
  • echarts的各种常用效果展示
  • Hibernate【inverse和cascade属性】知识要点
  • Java反射-动态类加载和重新加载
  • JS实现简单的MVC模式开发小游戏
  • magento 货币换算
  • MQ框架的比较
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Cloud Feign的两种使用姿势
  • Vue学习第二天
  • vue学习系列(二)vue-cli
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 复杂数据处理
  • 解析带emoji和链接的聊天系统消息
  • 配置 PM2 实现代码自动发布
  • 区块链共识机制优缺点对比都是什么
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 再谈express与koa的对比
  • 最近的计划
  • 白色的风信子
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #Lua:Lua调用C++生成的DLL库
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (笔试题)分解质因式
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)基于IDEA的JAVA基础12
  • ***检测工具之RKHunter AIDE
  • ./configure,make,make install的作用
  • .form文件_SSM框架文件上传篇