Spring 线程池配置

Spring 通过 ThreadPoolTaskExecutor 实现线程池技术,它是使用 JDK 中的 java.util.concurrent.ThreadPoolExecutor 进行实现;

Spring 配置线程池,两种方式:

方式1:XML 中配置 bean


<context:component-scan base-package="spring.task"/>


<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    
    <property name="corePoolSize" value="5" />
    
    <property name="maxPoolSize" value="10" />
    
    <property name="keepAliveSeconds" value="60" />
    
    <property name="queueCapacity" value="50" />
    
    <property name="allowCoreThreadTimeOut" value="true"/>
    
    <property name="rejectedExecutionHandler">
        <bean class="java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy" />
    property>
bean>

配置解析:

新任务启动时:

  • 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务;
  • 如果此时线程池中的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列;
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maxPoolSize,建新的线程来处理被添加的任务;
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maxPoolSize,那么通过handler所指定的策略来处理此任务;
  • 当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,如果allowCoreThreadTimeOut为false,则线程数量维持在corePoolSize, 如果为true,则线程数量可最低降至0;

方式2:XML中 使用 task:executor 标签


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation=
       "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

     
    <context:component-scan base-package="spring.task"/>

    
    <task:executor id="executor" pool-size="5" queue-capacity="10" rejection-policy="DISCARD_OLDEST"/>

beans>

测试:定义一个组件类,在应用启动时,同时启动 10 个线程;

@Component
public class AsyncTask {

    @Autowired
    private ThreadPoolTaskExecutor executor;

    @PostConstruct
    public void testAsycTask() {
        for (int i = 0; i < 10; i++) {
            executor.execute(new Runnable() {
                public void run() {
                    asyncTask();
                }
            });
        }
    }

private void asyncTask(){
        System.out.println( "---" + Thread.currentThread().getName());
    }   
}

注意:

@PostConstruct 用来修饰一个非静态的void() 方法;被 @PostConstruct 修饰的方法会在服务器加载 Servlet 的时候运行,并且只会被服务器执行一次;@PostConstruct 在构造函数之后执行,init() 方法之前执行;

结果:

---executor-1
---executor-2
---executor-3
---executor-4
---executor-5
---executor-6
---executor-7
---executor-8
---executor-9
---executor-10

你可能感兴趣的:(JAVA专栏,spring,java)