工作中使用Executors.newFixedThreadPool(n)创建线程池时,阿里巴巴java开发手册提示要手动创建线程池.提示信息是;更加明确理程池运行规则,规避资源耗尽风险。
手动创建线程池的一种方式:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
- corePoolSize: 核心线程数
- maximumPoolSize: 最大线程数
- keepAliveTime:一个非核心线程,如果不干活(闲置状态)的时长超过这个参数所设定的时长,就会被销毁掉如果设置allowCoreThreadTimeOut
= true,则会作用于核心线程 workQueue :线程队列
线程池的运行规则:新任务在方法 execute(java.lang.Runnable) 中提交(即开线程)时,如果运行的线程少于 corePoolSize,则线程数就是所开的线程数,即新任务提交则新开线程即使其他辅助线程是空闲的。如果运行的线程多于 corePoolSize 而少于 maximumPoolSize,线程进入线程队列,且仅当队列满时才创建新线程。如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。
提示原因:当使用Executors创建线程时,核心线程数最大线程数等于传入参数,keepAlivetime为0,workQueue队列的长度默认为Integer.MAX_VALUE即integer的最大值。所以当创建的线程数远大于线程池数将进入队列阻塞,理论上队列可以阻塞Integer.MAX_VALUE个线程,从而造成内存资源耗尽。