测试线程池最大线程数。
首先注册一个线程池
@Bean("threadPool") public ExecutorService buildThreadPoolExecutor(){ //keepAliveTime 的时间单位 TimeUnit unit = TimeUnit.MILLISECONDS; //用来储存等待执行任务的队列 LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(2); //线程工厂 ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("log-pool-%d").build(); //拒绝策略。这里使用 丢弃任务并抛出RejectedExecutionException异常 RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); log.info("全局线程池创建成功,线程池核心池的大小:{},线程池的最大线程数:{},当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间:{}", 1, 2, 0); //自定义线程池 return new ThreadPoolExecutor(1, 2, 0, unit, workQueue, namedThreadFactory, handler); }
我这里设置了核心线程池的大小和最大线程数量,注意,如果线程池已经满了,就会放到等待执行的队列中,我这里将 LinkedBlockingQueue 设置为 2,也就是队列最大也就2的深度,一旦超过了缓存队列的深度,就会触发拒绝策略,这里的策略是抛出异常,无法执行的时候,抛出 RejectedExecutionException 异常。
所以要做判断线程是否还有空余位置,只要加入判断队列即可。
// 排队的线程数量 int size = threadPool.getQueue().size(); // 当前线程池中正在执行任务的线程数量 int activeCount = threadPool.getActiveCount(); // 线程池当前的线程数量 int poolSize = threadPool.getPoolSize(); int corePoolSize = threadPool.getCorePoolSize(); int maximumPoolSize = threadPool.getMaximumPoolSize(); System.out.println("size:" + size + " activeCount:" + activeCount + " poolSize:" + poolSize + " corePoolSize:" + corePoolSize + " maximumPoolSize:" + maximumPoolSize); // 这里的 6 就是 LinkedBlockingQueue 的大小。上面我设置的是2,后面改成了6测试 if (size >= 6){ return "任务队列已满"; }