首页 > 基础资料 博客日记

通用线程池2

2024-10-10 15:00:04基础资料围观81

文章通用线程池2分享给大家,欢迎收藏Java资料网,专注分享技术知识

 1 public enum CommonThreadPoolEnum {
 2 
 3     TAKE_PHONE_NUMBER_THREAD_POOL;
 4 
 5     private ThreadPoolExecutor executor;
 6 
 7     CommonThreadPoolEnum() {
 8         int corePoolSize = 6;
 9         int maximumPoolSize = 6;
10         int workQueue = 500;
11         executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 30000 L, TimeUnit.MILLISECONDS, 
12         new LinkedBlockingQueue<>(workQueue), 
13         new ThreadPoolExecutor.DiscardPolicy());
14         executor.allowCoreThreadTimeOut(true);//核心线程允许在空闲keepAlive时间后关闭。即这里设置为true后,线程池中的线程数可能会为0.
15     }
16 
17     /**
18      * 添加带返回值的任务
19      */
20     public <M> Future <M> add(Callable <M> task) {
21         return executor.submit(task);
22     }
23 
24     /**
25      * 添加不带返回值的任务
26      */
27     public void add(Runnable task) {
28         executor.execute(task);
29     }
30 }

该线程池使用了枚举类,而没有使用普通的类

线程池自定义了最大线程数、核心线程数、线程排队数,以及当线程排队超过限制时对超出部分线程的处理策略(这里是直接丢弃)

使用该线程池时,根据具体任务的类型,选择带返回结果或不带返回结果的方法


一般我们创建线程池时,为防止资源被耗尽,任务队列都会选择创建有界任务队列,但种模式下如果出现任务队列已满且线程池创建的线程数达到你设置的最大线程数时,这时就需要你指定ThreadPoolExecutor的RejectedExecutionHandler参数即合理的拒绝策略,来处理线程池"超载"的情况。ThreadPoolExecutor自带的拒绝策略如下:

1、AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作;

2、CallerRunsPolicy策略:如果线程池的线程数量达到上限,该策略会把任务队列中的任务放在调用者线程当中运行;

3、DiscardOledestPolicy策略:该策略会丢弃任务队列中最老的一个任务,也就是当前任务队列中最先被添加进去的,马上要被执行的那个任务,并尝试再次提交;

4、DiscardPolicy策略:该策略会默默丢弃无法处理的任务,不予任何处理。当然使用此策略,业务场景中需允许任务的丢失;


文章来源:https://www.cnblogs.com/ZT-SummerRain/p/18456018
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云