当前位置: 首页 > 后端技术 > Java

ThreadPoolExecutor构造方法七参数及拒绝策略详解

时间:2023-04-01 22:50:10 Java

为什么要调用ThreadPoolExecutor构造方法创建线程池,因为阿里巴巴开发手册上说:先了解一下ThreadPoolExecutor的七参数是什么施工方法表示。ThreadPoolExecutor类的源代码如下:/***使用给定的初始*参数创建一个新的{@codeThreadPoolExecutor}。**@paramcorePoolSize要保留在池中的线??程数,即使*如果它们处于空闲状态,除非设置了{@codeallowCoreThreadTimeOut}*@parammaximumPoolSize*池中允许的最大线程数*@paramkeepAliveTime当线程数大于*核心,这是多余的空闲线程*在终止前等待新任务的最长时间。*@paramunit{@codekeepAliveTime}参数的时间单位*@paramworkQueue在执行任务之前用于保存任务的队列。该队列将仅保存{@codeRunnable}*由{@codeexecute}方法提交的任务。*@paramthreadFactory执行者创建新线程时使用的工厂*@paramhandler当执行被阻塞时使用的处理程序*因为达到了线程边界和队列容量*@throwsIllegalArgumentException如果以下之一成立:
*{@codecorePoolSize<0}
*{@codekeepAliveTime<0}
*{@codemaximumPoolSize<=0}
*{@codemaximumPoolSizeworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler){if(corePoolSize<0||最大池大小<=0||maximumPoolSize());}publicLinkedBlockingQueue(){这(Integer.MAX_VALUE);}SingleThreadExecutor/***SingleThreadExecutor是单线程,但是队列没有指定容量,默认是MAX_VALUE。都可以一直创建新任务,导致OOM*/publicstaticExecutorServicenewSingleThreadExecutor(){returnnewFinalizableDelegatedExecutorService(newThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue()));}CachedThreadPool/***CachedThreadPool最大线程为MAX_VALUE,默认队列为SynchronousQueue,阻塞。所以当有新的任务来的时候,会创建一个新的线程,导致OOM*/publicstaticExecutorServicenewCachedThreadPool(){returnnewThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,newSynchronousQueue());}ScheduledThreadPool/***CachedThreadPool最大线程大小为MAX_VALUE,队列为DelayedWorkQueue,默认长度为16,所以一直有新的线程创建,导致OOM*/publicSc??heduledThreadPoolExecutor(intcorePoolSize){super(corePoolSize,Integer.MAX_VALUE,0,NANOSECONDS,newDelayedWorkQueue());}