1. 程式人生 > 其它 >spring註解實現執行緒池

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------------

可以說明我們的非同步執行成功了