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

目录
自定义线程池的使用
四种拒绝策略代码体现
1. 自定义线程池的使用
自定义线程池(拒绝策略默认AbortPolicy)

1public class MyThreadPoolDemo { 2    public static void main(String[] args) { 3        ExecutorService threadPool = new ThreadPoolExecutor(2, 4                5, 5                1L, 6                TimeUnit.SECONDS, 7                new LinkedBlockingQueue<Runnable>(3), 8                Executors.defaultThreadFactory(), 9                new ThreadPoolExecutor.AbortPolicy()); 10 11        try { 12//        模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程。 13            for (int i = 1; i <= 5; i++) { 14                threadPool.execute(() -> { 15                    System.out.println(Thread.currentThread().getName() + "\t 办理业务"); 16                }); 17            } 18        } catch (Exception e) { 19            e.printStackTrace(); 20        } finally { 21            threadPool.shutdown(); 22        } 23    } 24}

当线程为5时执行结果:


2. 四种拒绝策略代码体现
AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行。
当线程数为9时,抛出异常。

CallerRunsPolicy:"调用者运行"一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
CallerRunsPolicy 拒绝策略,将线程变为10时执行结果


DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。
DiscardOldestPolicy拒绝策略,将线程变为10时执行结果:


DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。
DiscardPolicy拒绝策略,直接丢包,将线程变为10时执行结果:

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java四种线程池类型以及可选择的阻塞队列

之前笔记有记录java线程池的拒绝策略,回顾一下线程池的处理任务的优先级:先考虑corePoolSize、任务队列(缓冲队列)workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。即:如果运行的线程少于corePoolSize,则Executor始终首选添加新的线程,而不进行排队

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

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