Spring4.x高级话题(二):多线程
2017-10-26 15:03
453 查看
转自:http://blog.longjiazuo.com/archives/1338
① 利用
② 配置类实现
① 通过
输出结果表明是并发执行而不是顺序执行的,
运行结果如下图所示:
码云地址:点击查看
一. 点睛
Spring通过任务执行器(
TaskExecutor)来实现多线程和并发编程。使用
ThreadPoolTaskExecutor可实现一个基于线程池的
TaskExecutor。而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过
@EnableAsync开启对异步任务的支持,并通过在实际执行的
Bean的方法中使用
@Async注解来声明其是一个异步任务。
二. 示例
1. 配置类
package org.light4j.sping4.senior.taskExecutor; import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration @ComponentScan("org.light4j.sping4.senior.taskExecutor") @EnableAsync //① public class TaskExecutorConfig implements AsyncConfigurer{//② @Override public Executor getAsyncExecutor() {//② ThreadPoolTaskExecutortaskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25); taskExecutor.initialize(); return taskExecutor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
代码解释:
① 利用@EnableAsync注解开启异步任务支持。
② 配置类实现
AsyncConfigurer接口并重写
getAsyncExecutor方法,并返回
ThreadPoolTaskExecutor,这样就获得了一个基于线程池的
TaskExecutor。
2. 任务执行类
package org.light4j.sping4.senior.taskExecutor; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service public class AsyncTaskService { @Async //① public void executeAsyncTask(Integer i){ System.out.println("执行异步任务: "+i); } @Async public void executeAsyncTaskPlus(Integer i){ System.out.println("执行异步任务+1: "+(i+1)); } }
代码解释:
① 通过@Async注解表明该方法是个异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用
ThreadPoolTaskExecutor作为
TaskExecutor。
3. 运行
package org.light4j.sping4.senior.taskExecutor; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class); AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class); for(int i =0 ;i<10;i++){ asyncTaskService.executeAsyncTask(i); asyncTaskService.executeAsyncTaskPlus(i); } context.close(); } }
输出结果表明是并发执行而不是顺序执行的,
运行结果如下图所示:
4. 源代码示例:
github地址:点击查看
码云地址:点击查看
相关文章推荐
- Spring高级话题_多线程
- spring boot-高级话题之 多线程、@EnableScheduling开启计划任务的支持(2)
- 【Spring】Spring高级话题-多线程-TaskExecutor
- SpringBoot4-spring高级话题-spring aware,多线程,计划任务,条件注解@Conditional
- 三-Spring高级话题(1)-多线程、计划任务-【JavaEE开发的颠覆者】
- 聊聊Spring4.x高级话题(一)Spring Aware
- 10-SpringBoot——Spring 高级话题-多线程
- 【Spring】Spring高级话题-多线程-TaskExecutor
- [转]C#中的多线程-第四部分:高级话题
- Spring高级话题-@Enable***注解的工作原理
- 【Spring】Spring高级话题-测试Spring项目
- Spring事务管理高级应用难点剖析之多线程的困惑
- 【Spring】Spring高级话题-条件注解-@Condition
- 【Spring】Spring高级话题-计划任务-@EnableScheduling
- spring boot之高级话题--组合注解与元注解(4)
- c#中多线程---高级话题
- 【Spring】Spring高级话题-条件注解-@Condition
- 【Spring】Spring高级话题-@Enable***注解的工作原理
- 09-SpringBoot——Spring 高级话题-Spring Aware
- SpringBoot5-spring高级话题-组合注解与元注解,@Enable*注解的工作原理,测试