郭卫东 发表于 2024-10-10 14:54:33

通用线程池2

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策略:该策略会冷静丢弃无法处理的使命,不予任何处理。当然利用此策略,业务场景中需允许使命的丢失;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 通用线程池2