1. 程式人生 > >spring 無配置檔案實現執行緒池管理

spring 無配置檔案實現執行緒池管理

最近做一個文件轉換功能比較耗時,所以用到了執行緒池來處理。

Spring管理執行緒池有兩種方式,

第一種是XML配置檔案配置執行緒池的Bean,然後在用的時候像Controller引用Service的Bean一樣的引用執行緒池物件就可以了。

第二種方式是無配置檔案,就是全是java程式碼和註解就實現了。

這裡只講解第二種方式。

總共分三步實現吧,

第一步:寫一個配置執行緒池的java類,並在類上加上註解,如下程式碼:

@Configuration
@EnableAsync
public class MutiThreadConfig {
    /**
     * 最閒時執行緒數量
     */
private int 
corePoolSize = 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(); return
executor; } }

第二步:啟動服務時例項化執行緒池物件,即在啟動的類上加如下第一行註解即可。

@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執行任務


到此,無配置檔案化的執行緒池管理完成。