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