线程池判断是否还可以加入任务

测试线程池最大线程数。

首先注册一个线程池

 @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 "任务队列已满";
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章