Spring配置异步线程池

/ Spring / 180浏览

线程池可以很好的控制线程数,以及更好的利用线程资源。那么在Spring项目中来配置线程池如下:
首先在contentApplication.xml中定义bean:

<!-- 异步线程池 -->
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <!-- 核心线程数 -->
    <property name="corePoolSize" value="5" />
    <!-- 最大线程数 -->
    <property name="maxPoolSize" value="20" />
    <!-- 队列最大长度 >=mainExecutor.maxSize -->
    <property name="queueCapacity" value="500" />
    <!-- 线程池维护线程所允许的空闲时间 -->
    <property name="keepAliveSeconds" value="300" />
    <!-- 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.  -->
    <property name="rejectedExecutionHandler">
        <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
    </property>
</bean>

然后需要一个Spring获取Bean的工具类:


package com.vivo.util;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringContextUtil implements ApplicationContextAware {
      /**
       * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.
       *
       */
      private static ApplicationContext applicationContext =
                  new FileSystemXmlApplicationContext("classpath:config/application-context.xml"); // Spring应用上下文环境
      /**
       * 实现ApplicationContextAware接口的回调方法,设置上下文环境
       *
       * @param applicationContext
       * @throws BeansException
       */
      public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringContextUtil.applicationContext = applicationContext;
      }
      /**
       * @return ApplicationContext
       */
      public static ApplicationContext getApplicationContext() {
            return applicationContext;
      }
      /**
       * 获取对象
       *
       * @param name
       * @return Object 一个以所给名字注册的bean的实例
       * @throws BeansException
       */
      public static Object getBean(String name) throws BeansException {
            return applicationContext.getBean(name);
      }
      /**
       * 获取类型为requiredType的对象
       * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
       *
       * @param name
       *            bean注册名
       * @param requiredType
       *            返回对象类型
       * @return Object 返回requiredType类型对象
       * @throws BeansException
       */
      public static Object getBean(String name, Class requiredType) throws BeansException {
            return applicationContext.getBean(name, requiredType);
      }
      /**
       * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
       *
       * @param name
       * @return boolean
       */
      public static boolean containsBean(String name) {
            return applicationContext.containsBean(name);
      }
      /**
       * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
       * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
       *
       * @param name
       * @return boolean
       * @throws NoSuchBeanDefinitionException
       */
      public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
            return applicationContext.isSingleton(name);
      }
      /**
       * @param name
       * @return Class 注册对象的类型
       * @throws NoSuchBeanDefinitionException
       */
      public static Class getType(String name) throws NoSuchBeanDefinitionException {
            return applicationContext.getType(name);
      }
      /**
       * 如果给定的bean名字在bean定义中有别名,则返回这些别名
       *
       * @param name
       * @return
       * @throws NoSuchBeanDefinitionException
       */
      public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
            return applicationContext.getAliases(name);
      }
}

最后在使用线程池时,通过该工具类先获取线程池bean对象,再去并发的执行线程。