實現多線程的方式有很多,有基於spring的配置方式,有基於java的bean方式。我比較懶,這裏就講下我認爲最簡單的springBoot集成多線程配置與使用。
一、集成配置多線程
@Configuration
@EnableAsync
@Slf4j
public class ThreadConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
Integer corePoolSize = LocalHostUtil.getCorePoolSize();
Integer maxPoolSize = LocalHostUtil.getMaxPoolSize();
Integer queueCapacity = LocalHostUtil.getQueueCapacity();
log.info("---------[多線程配置初始化],最大核心線程數:{},最大線程池數量:{},線程處理隊列長度:{}",corePoolSize,maxPoolSize,queueCapacity);
//核心線程數
executor.setCorePoolSize(corePoolSize);
//最大線程池數量
executor.setMaxPoolSize(maxPoolSize);
//線程處理隊列長度
executor.setQueueCapacity(queueCapacity);
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
log.info("-----------多線程異常handler------------");
return new SpringAsyncExceptionHandler();
}
class SpringAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
log.error("Asyn無返回異常:"+ ex.getCause().getMessage() + method.getName() + params);
}
}
}
就這一個配置類就ok了,LocalHostUtil是取properties配置文件的配置的。一定注意上面的2個註解@Configuration配置類註解
@EnableAsync開啓異步支持
二、多線程使用
service的實現類寫個方法(這樣不破壞結構),方法依然可以是實現service接口裏的方法,但是一定要注意去掉
@Override註解,而是使用 @Async註解,例如:
@Service
@Transactional
@Slf4j
public class JobCallServiceImpl implements JobCallService{
@Resource
private NoticeSendUserMapper noticSendUserMapper;
@Async
public void smsMsgSend(String noticeId,String lang,String reqId) {
//你的異步執行邏輯
}
就這樣,controller裏已經返回數據給調用方了,而後臺會開這個線程再處理業務邏輯。我這裏要的場景就是及時返回調用成功給調用方,然後再邏輯執行完後再異步反饋執行結果。
到此springboot的多線程集成與使用就分享完了,是不是超級簡單。這裏是基於異步支持實現的,我覺得是最簡單的,我最喜歡。