Spring 应用中配置线程池
在spring-task.xml核心配置文件中配置,并在Spring的总入口出导入此配置文件,这里只是为了管理方便,当然也可以直接在入口处直接配置。
<import resource="spring-task.xml"/>
在Spring-task.xml文件中装载线程池相关对象内容
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数 --> <property name="corePoolSize" value="4" /> <!-- 最大线程数 --> <property name="maxPoolSize" value="20" /> <!-- 队列最大长度 --> <property name="queueCapacity" value="20" /> <!-- 线程池维护线程所允许的空闲时间,默认为60s --> <property name="keepAliveSeconds" value="60" /> </bean>
在Controller中注入线程池,这里使用根据名称注入的方式,当然也可以使用根据类型注入的方式
//这里使用根据名称注入的方式,当然也可以使用根据类型注入的方式 @Resource(name = "taskExecutor") private TaskExecutor taskExecutor;
在方法中新建一个子线程
for (int i=0;i<10;i++) { System.out.println("开始执行线程池任务,编号:"+i); taskExecutor.execute(new Runnable() { @Override public void run() { System.out.println("正在执行run()方法,线程名称:" + Thread.currentThread().getName()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }finally { System.out.println("run()方法执行完成,线程名称:" + Thread.currentThread().getName()); } } }); } return "正在返回数据信息";
测试结果
该方法中不存在LogAnnotation注解 开始执行线程池任务,编号:0 开始执行线程池任务,编号:1 开始执行线程池任务,编号:2 正在执行run()方法,线程名称:taskExecutor-2 正在执行run()方法,线程名称:taskExecutor-3 开始执行线程池任务,编号:3 正在执行run()方法,线程名称:taskExecutor-1 正在执行run()方法,线程名称:taskExecutor-4 开始执行线程池任务,编号:4 开始执行线程池任务,编号:5 开始执行线程池任务,编号:6 开始执行线程池任务,编号:7 开始执行线程池任务,编号:8 开始执行线程池任务,编号:9 run()方法执行完成,线程名称:taskExecutor-3 run()方法执行完成,线程名称:taskExecutor-2 正在执行run()方法,线程名称:taskExecutor-3 正在执行run()方法,线程名称:taskExecutor-2 run()方法执行完成,线程名称:taskExecutor-1 run()方法执行完成,线程名称:taskExecutor-4 正在执行run()方法,线程名称:taskExecutor-1 正在执行run()方法,线程名称:taskExecutor-4 run()方法执行完成,线程名称:taskExecutor-3 run()方法执行完成,线程名称:taskExecutor-2 正在执行run()方法,线程名称:taskExecutor-3 正在执行run()方法,线程名称:taskExecutor-2 run()方法执行完成,线程名称:taskExecutor-4 run()方法执行完成,线程名称:taskExecutor-1 run()方法执行完成,线程名称:taskExecutor-3 run()方法执行完成,线程名称:taskExecutor-2