新建一個線程池的配置類,需要被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