自定义线程池和拒绝策略的使用


import java.util.concurrent.*;

/**          |-> 小于corePoolSize -> 分配线程执行
 * 任务提交-> |                                      |->成功->等待执行
 *           |-> 大于corePoolSize -> 提交到等待队列 ->|                   |->达到maximumPoolSize线程,提交失败->拒绝执行
 *                                                  |->失败->提交线程池->|
 *                                                                     |->未达到,提交成功->分配线程执行
 *
 *  自定义线程池和拒绝策略的使用
 */
public class RejectThreadPoolDemo {
    public static class MyTask implements Runnable{
        @Override
        public void run() {
            System.out.println(System.currentTimeMillis()+" Id:"+Thread.currentThread().getId());
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) throws InterruptedException{
        MyTask task = new MyTask();
        /**
         *  public ThreadPoolExecutor(int corePoolSize, //指定线程池中线程数量
         *                               int maximumPoolSize, //指定线程池中的最大线程数量
         *                               long keepAliveTime, //超过corePoolSize的空闲线程,在多长时间内会被销毁
         *                               TimeUnit unit, //keepAliveTime的单位
         *                               BlockingQueue<Runnable> workQueue,//任务队列
         *                               ThreadFactory threadFactory,//线程工厂,一般默认即可
         *                               RejectedExecutionHandler handler) {//拒绝策略,当任务太多来不及处理,如何拒绝任务
         */
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0L,
                TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(10),
                Executors.defaultThreadFactory(), new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { //r:请求执行的任务  executor:当前的线程池
                //打印丢失的任务
                System.out.println(r.toString() + " is discard");
            }
        });
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            executor.submit(task);
            Thread.sleep(10);
        }
    }
    //1567644472625 Id:9
    //1567644472631 Id:10
    //1567644472646 Id:11
    //1567644472654 Id:12
    //1567644472665 Id:13
    //java.util.concurrent.FutureTask@60e53b93 is discard
    //java.util.concurrent.FutureTask@5e2de80c is discard
    //。。。
}

转载于:https://www.cnblogs.com/fly-book/p/11462934.html

45.自定义线程池(三)-拒绝策略 在原来的基础上添加了 带超时时间的阻塞添加方法,offer方法。 阅读详情

相关推荐

ThreadPoolExecutor线程池,通过自定义任务类和自定义拒绝策略,获取被拒绝任务的数据

为了在拒绝策略中获取任务数据,可以使用自定义的任务类来封装任务逻辑和相关数据。将自定义任务提交到线程池,并配置自定义拒绝策略。类封装了任务的 ID 和数据,并实现了。在自定义拒绝策略中,可以通过类型检查将。转换为自定义的任务类(如。),然后提取任务数据。

weixin_42551921的博客 318

自定义线程池拒绝策略

一. 默认的拒绝策略 ThreadPoolExceutor.AbortPolicy : 丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务 ThreadPoolExecutor.CallerRunsPolic

BUG指挥课堂 5341

FPGA八股文(2)——笔试的FPGA问题汇总(持续更新)

常见FPGA笔试题的概念总结

居安士的博客 8902

线程池的拒绝策略(自定义拒绝策略)

源码如下,都实现了RejectedExecutionHandler 接口,是策略模式的一种体现。如果在创建线程池的时候没有指定拒绝策略,默认会采用 AbortPolicy。相当于把一个接口组合了进来,我们可以重写该接口的方法,自定义一种拒绝策略。

trigger的博客 3764

【MMDetection3.0实战】从零构建自定义数据集训练流程

本文详细介绍了使用MMDetection3.0框架从零开始构建自定义目标检测数据集的完整训练流程。内容涵盖环境配置、COCO格式数据准备、核心代码改造、模型配置与训练策略调优,以及最终的模型测试与验证,帮助开发者快速上手并训练自己的检测模型。

l6m7n8的博客 313

PCL1.12.1+VTK9.1+Qt5.14.2实战:解决QVTKOpenGLNativeWidget点云渲染窗口初始化报错问题

本文针对PCL1.12.1、VTK9.1与Qt5.14.2集成开发中,QVTKOpenGLNativeWidget点云渲染窗口初始化时出现的报错与黑屏问题,提供了深度分析与两种实战解决方案。核心在于理解VTK版本升级导致的渲染窗口类型不匹配,并指导开发者通过显式创建vtkGenericOpenGLRenderWindow或利用窗口ID嵌入,正确初始化并绑定可视化组件,从而稳定实现点云渲染。

weixin_29284657的博客 221

Java并发编程系列之四:自定义线程池拒绝策略

引言 ThreadPoolExcutor是JDK自带的线程池。

1958

3D点云目标检测Complex-YOLO(训练篇)(一)———KITTI数据集预处理与制作

KITTI dataset Download dataset KITTI 3D Object Detection Evaluation 2017 link 下载四个部分,共41.4GB 解压后为四部分内容(相机校准矩阵calib、RGB图像image_2、标签label_2、点云数据velodyne) 对应的testing和training数据。其中,training数据为7481张(图片和点云对应的场景),testing数据 7518张(无label_2数据)。 Data Preprocess

“知识最大的敌人不是无知,而是错觉” 7150

线程池-拒绝策略

当 Java 提供的这四个拒绝策略你觉得不好用时,你可以自己定义这个拒绝策略来处理。也就是提供接口的实现即可。10,60,// 使用当发生拒绝策略的时候使用forkJoinPool这个线程来执行任务@Override10 个被执行,10 个被执行。当然这里不建议使用这种方式来处理,当大量任务会被执行拒绝策略的时候,这会导致的线程池无线扩充,最终导致内存异常等问题。这里只是举例慎用!!!!当然这里不建议使用这种方式来处理,当大量任务会被执行拒绝策略的时候,这会导致。

假女吖的博客 1734

Win11下USB-Blaster驱动安装全攻略:Quartus用户必看(附常见问题解决)

本文详细介绍了在Windows 11系统下为Intel FPGA开发工具Quartus安装USB-Blaster驱动的完整流程与常见问题解决方案。针对Win11更严格的驱动签名验证机制,提供了从标准安装步骤到高级故障排查(如禁用驱动强制签名、使用测试模式)的实用指南,帮助用户快速解决驱动安装失败问题,确保FPGA编程调试顺利进行。

weixin_29256771的博客 659

KVM — 与 QEMU 和 Libvirt 的关系

目录目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用前言如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会有所混淆, 傻傻的分不清. 尤其在看虚拟化技术文档时导致理解能力下降, 所以在开始学习虚拟化技术之前对这些概念有一个整体的认识和清晰的理解, 就显得很有必要了.KVMKVM(Kernel-basedVirtu

烟云的计算 5736

使用SynchronousQueue和自定义拒绝策略创建线程池

使用SynchronousQueue和自定义拒绝策略创建线程池1、拒绝策略2、第一种 1、拒绝策略 拒绝策略详情参见该地址 2、第一种 使用多线程进行训练任务时,如果corePoolSize和maximumPoolSize都满了,那新来的线程又不能丢弃,所以已有的拒绝策略不太能满足需求 ExecutorService executor = new ThreadPoolExecutor(4, // corePoolSize 4, // maximumPoolSize 0

qq_36641571的博客 773

硬件电路RS485通信EMC 设计

RS485通讯硬件设计与STM32实现要点 本文详细介绍了RS485通讯系统的硬件设计和STM32实现方案。硬件设计重点包括:采用总线型拓扑结构、120Ω终端电阻匹配、屏蔽双绞线布线、TVS管和自恢复保险丝保护等核心要素。EMC设计强调共模电感抑制干扰、屏蔽层单端接地、光电隔离等技术。软件实现方面,提供了基于STM32F103的完整程序框架,包括UART初始化、收发控制逻辑和中断处理机制,特别强调了收发切换时机、波特率精度等关键注意事项。文中还给出了工业传感器节点的实际应用案例,展示了一个完整的EMC防护电

qq_37999850的博客 1383

线程池中的拒绝策略是什么东东?

线程池中的拒绝策略一、拒绝策略产生缘由?二、何时触发使用拒绝策略三、拒绝策略都有哪些?1、AbortPolicy策略2、CallerRunsPolicy策略3、DiscardOldestPolicy策略4、DiscardPolicy策略自定义拒绝策略线程池使用拒绝策略demo 一、拒绝策略产生缘由? 线程池工作中,如果任务量很大,超过系统实际承载能力时,如果不予理睬,接着可能系统就崩溃了,所以jdk内置提供了线程池的4种拒绝策略,合理的解决这种问题。 二、何时触发使用拒绝策略 线程池中线程已经用完不能再创建

小浪与艳花 1488

【立创EDA-PCB设计基础】6.布线铺铜实战及细节详解

本文进行布线铺铜实战及详解布线铺铜的细节

嵌入式阿齐Archie 4万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

线程池执行流程以及拒绝策略

/ 任务的具体方法@OverrideSystem.out.println("当前任务被执行,执行时间:" + new Date() +" 执行线程:" + Thread.currentThread().getName());try {// 等待 1s// 创建线程,线程的任务队列的长度为 1@Override// 执行自定义拒绝策略的相关操作System.out.println("我是自定义拒绝策略~");});// 添加并执行 4 个任务。

weixin_46038850的博客 585

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java的自定义线程池

本节主要讲解Java的自定义线程池,从自定义线程池的原因、自定义线程池、自定义拒绝策略的原因,自定义拒绝策略来帮助深刻理解Java的自定义线程池。

yjp1240201821的博客 1288

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...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java队列、线程池及ThreadPoolExecutor自定义线程池实现

Java队列、线程池及ThreadPoolExecutor自定义线程池实现

一恍过去 1万+

java如何自定义线程线程池

选择合适的任务队列(:根据应用场景选择适当的任务队列类型。自定义线程工厂(:通过自定义线程工厂,可以为线程设置特定的名称、优先级等。选择或自定义拒绝策略(:根据任务负载情况选择合适的拒绝策略,或者自定义拒绝策略。配置核心线程数和最大线程数:根据实际需求合理配置核心线程数和最大线程数。配置空闲线程存活时间:根据任务的执行时间和频率,设置适当的空闲线程存活时间。下面是一个自定义线程池的示例,其中包含了自定义线程工厂、自定义拒绝策略,并使用了作为任务队列。// 自定义线程工厂类。

Flying_Fish_roe的博客 1578

Hippo4j线程池自定义拒绝策略开发指南

在Java线程池中,当任务无法被处理时(通常是因为线程池已关闭或队列已满),就会触发拒绝策略。Java内置提供了几种标准拒绝策略,如: - AbortPolicy:直接抛出RejectedExecutionException异常 - CallerRunsPolicy:由调用线程直接执行该任务 - DiscardPolicy:直接丢弃任务,不做任何处理 - DiscardOldestPolicy:...

gitblog_00451的博客 333

【SpringBoot】多线程以及自定义拒绝策略(基于@Async)

一、使用@Async在SpringBoot项目中实现多线程 1. 多线程Configuration 启动类: import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframew...

唐Ian的博客 7377

JAVA 线程池,及7大参数,4大拒绝策略详解

如上图所示,执行顺序为:当提交任务数大于核心线程数时,会优先将任务放到阻塞队列中。当阻塞队列饱和时,会扩充线程池中的线程数,直到达到最大线程数。当任务数超出最大线程数时,就会触发线程池的拒绝策略。/**} /**throw new RejectedExecutionException("任务 " + r . toString() + " 拒绝 from " + e . toString());System . out . println("创建线程:" + r);t < 20。

shxguozhq的博客 1694

33自定义线程池【线程工厂、拒绝策略】、带有返回值的任务类

1.自定义线程池 自定义线程工厂 自定义拒绝策略 2.带有返回值的任务类 --Callable 3.File 关注文件信息,而非文件内容 相对路径和绝对路径的区别

gangain的博客 1427

Java线程池拒绝策略

线程池中的任务队列已满时,新任务将被拒绝。这种情况下,线程池会采取一定的策略来拒绝新任务,这就是线程池的拒绝策略。

架构师之路。。 458

线程池,及7大参数,4大拒绝策略详解

创建线程需要开辟本地线程栈、虚拟机栈、程序计数器等私有线程内存,消耗的时候也需要释放这些内存,频繁的创建和销毁需要⼀定的开销;当任务数远远⼤于线程可以承载的数量之后,不能友好的进⾏任务拒绝。//核心线程池数//最大线程池数//线程存活时间//存活时间单位//阻塞队列//线程工厂@OverrideSystem.out.println("创建线程:" + r);unit,workQueue,r -> {System.out.println("创建线程:" + r)

u013149491的博客 1954

Java多线程之线程池的手写改造和拒绝策略

Java多线程之线程池底层工作原理

努力努力再努力L 501
上一篇: 26.LockSupport线程阻塞工具
下一篇: 自定义线程创建
dffxwe51549
博客等级 码龄12年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值