spring 無配置檔案實現執行緒池管理
阿新 • • 發佈:2019-02-17
最近做一個文件轉換功能比較耗時,所以用到了執行緒池來處理。
Spring管理執行緒池有兩種方式,
第一種是XML配置檔案配置執行緒池的Bean,然後在用的時候像Controller引用Service的Bean一樣的引用執行緒池物件就可以了。
第二種方式是無配置檔案,就是全是java程式碼和註解就實現了。
這裡只講解第二種方式。
總共分三步實現吧,
第一步:寫一個配置執行緒池的java類,並在類上加上註解,如下程式碼:
@Configuration @EnableAsync public class MutiThreadConfig { /** * 最閒時執行緒數量 */ private intcorePoolSize = 10; /** * 最忙時執行緒數量 */ private int maxPoolSize = 30; /** * 執行緒佇列快取大小 */ private int queueCapacity = 8; /** * 執行緒最大空閒時間 */ private int keepAlive = 60; @Bean public Executor myExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); executor.setThreadNamePrefix("mqExecutor-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //對拒絕task的處理策略 executor.setKeepAliveSeconds(keepAlive); executor.initialize(); returnexecutor; } }
第二步:啟動服務時例項化執行緒池物件,即在啟動的類上加如下第一行註解即可。
@EnableAsync //啟動執行緒池 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
第三步:寫需要耗時的任務,這裡寫在Service的實現類裡,把耗時任務單獨抽成一個方法(如例子中mytask()方法),如果整個service都需要非同步執行,直接把註解@Async加在Service的方法上也可以,如doMutiExcute()方法。
@Service public class UserServiceImpl implements UserService { @Override public User getUser(String id) { User user = new User(); user.setAge(10); user.setName("zhc"); user.setId(id); return user; } @Override public String doMutiExcute(String name) { Long threadId = myTask(); return "總共運行了"+threadId+"個執行緒"; } @Async public Long myTask() { Long threadId = Long.MIN_VALUE; try { threadId = Thread.currentThread().getId(); System.out.println("當前執行緒ID="+threadId); Thread.sleep(2000);//設定耗時任務 }catch (InterruptedException e){ e.printStackTrace(); } return threadId; } }
測試:
寫一個controller呼叫service
@RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/getUser") public User getUser(@RequestParam(value="id", defaultValue="1") String id) { return userService.getUser(id); } @RequestMapping("/doExcute") public String excuteMutiThread(String name){ return userService.doMutiExcute(name); } }
啟動服務,在瀏覽器訪問http://localhost:8080/doExcute?name=zhc
後面列印顯示了用不同執行緒ID執行任務
到此,無配置檔案化的執行緒池管理完成。