spring注解实现线程池

@Configuration
@EnableAsync

@Configuration用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@EnableAsync开始对异步任务的支持

@Async(value = "asyncOrderRespTaskExecutor")
注解来声明一个或多个异步任务,可以加在方法或者类上,加在类上表示这整个类都是使用这个自定义线程池进行操作

@Configuration
@EnableAsync
@Slf4j
public class OrderRespAsyncTaskConfig {

/**
* Set the ThreadPoolExecutor's core pool size.
*/
private int corePoolSize = 300;
/**
* Set the ThreadPoolExecutor's maximum pool size.
*/
private int maxPoolSize = 300;

private String ThreadNamePrefix = "OrderResp-Async-Executor-";

@Bean
public Executor asyncOrderRespTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setThreadNamePrefix(ThreadNamePrefix);

// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
if (executor != null) {
executor.shutdown();
}
} catch (Exception ex) {
log.error("AsyncTaskConfig.executor.shutdown() error", ex);
try {
executor.shutdown();
} catch (Exception e) {
log.error("AsyncTaskConfig.executor.shutdownNow() error", e);
}
}
}));

return executor;
}
}


 

 

@Async注解来声明一个或多个异步任务,可以加在方法或者类上,加在类上表示这整个类都是使用这个自定义线程池进行操作

接着我们可以创建control类@Autowired这个service并且调用这其中两个方法,进行连续调用,会发现运行结果是

--------start-service1------------

--------start-service2------------

--------end-service2------------

--------end-service1------------

可以说明我们的异步运行成功了

 

 

 

 

 

/**
* 默认交易的任务执行线程池.
* @return
*/
@Bean("tradeParalleFlowExector")
public ExecutorService tradeParalleFlowExector() {
ExecutorService executorService = Executors.newFixedThreadPool(100);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
if (executorService != null) {
executorService.shutdown();
}
} catch (Exception ex) {
log.error("easyFlowExecutor.shutdown() error", ex);
try {
executorService.shutdownNow();
} catch (Exception e) {
log.error("easyFlowExecutor.shutdownNow() error", e);
}
}
}));
return executorService;
}
posted @ 2022-01-04 11:52  91程序猿  阅读(418)  评论(0编辑  收藏  举报