新建一個線程池的配置類,需要被spring掃描到。
@Configuration
@EnableAsync
public class ThreadExecutorConfig {
@Bean
public Executor executor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);//線程池維護線程的最少數量
executor.setMaxPoolSize(50);//線程池維護線程的最大數量
executor.setQueueCapacity(15);//緩存隊列
executor.setThreadNamePrefix("ssmsExecutor-");
/**
* 對拒絕task的處理策略
rejection-policy:當pool已經達到max size的時候,如何處理新任務
CALLER_RUNS:不在新線程中執行任務,而是由調用者所在的線程來執行
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setKeepAliveSeconds(60);//允許的空閑時間
executor.initialize();
return executor;
}
}
添加一個普通類,里面編寫需要執行的方法,方法加上@Async注解,調用方法時自動啟動線程。
@Component
public class BmtOrderThread {
@Async
public Future<Map<String,Object>> test1() {
Map<String,Object> result=new HashMap<String,Object>();
return new AsyncResult<>(result);
}
@Async
public void test2() {
System.out.println("hello");
}
}
調用有返回值的線程方法:
public static void main(String[] args) {
List<Future<Map<String,Object>>> futures = new ArrayList<>();//存線程的返回結果
//以下調用會啟動線程進行執行,多線程並發
Future<Map<String,Object>> res1=bmtOrderThread.test1();
futures.add(res1);
Future<Map<String,Object>> res2=bmtOrderThread.test1();
futures.add(res2);
//會等待所有線程都執行結束,拿到結果
try {
for(Future future:futures) {
Object obj=future.get();
Map<String,Object> result=(Map<String,Object>)obj;
}
} catch(Exception e) {
e.printStackTrace();
}
}
調用無返回值的線程方法:
public static void main(String[] args) {
//以下方法會啟動多線程,並發執行
bmtOrderThread.test1();
bmtOrderThread.test1();
bmtOrderThread.test1();
}
參考的博客:
https://blog.csdn.net/qq_39385706/article/details/79365849
https://blog.csdn.net/weixin_38399962/article/details/82146480
https://www.cnblogs.com/guyezhai/p/5776357.html
