1、创建线程池
根据服务器配置设置线程池参数,如下是标准配置:
package ...
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
public class TaskExecutorConfig {
@Bean("getCheckSQLTaskExecutor")
public TaskExecutor getCheckSQLTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(5);
// 设置最大线程数
executor.setMaxPoolSize(5);
// 设置队列容量
executor.setQueueCapacity(10);
// 设置线程活跃时间(秒)
executor.setKeepAliveSeconds(60);
// 设置默认线程名称
executor.setThreadNamePrefix("checkSql-");
// 设置拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
// 等待超过30s强制终止程序
executor.setAwaitTerminationSeconds(30);
return executor;
}
}
2、设置执行任务
package ...
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
//省略...
List<CheckSQLDTO> resultList = new ArrayList();
CompletableFuture<Void>[] completableFutures = new CompletableFuture[countThread];
for(int i = 0;i< countThread ;i++){
List<LpcRiskUW> l = lists.get(i);
CompletableFuture<Void> idCardAuthenticationTask = CompletableFuture.runAsync(() -> {
List<CheckSQLDTO> result = checkSQLService.excuteSQL(l);
if(result.size()!=0){
resultList.addAll(result);
}
}, taskExecutorConfig.getCheckSQLTaskExecutor());
completableFutures[i] = idCardAuthenticationTask;
}
CompletableFuture<Void> summaryTask = CompletableFuture.allOf(completableFutures);
try {
summaryTask.get();
} catch (InterruptedException e) {
log.error("多线程错误",e);
} catch (ExecutionException e) {
log.error("多线程错误",e);
}
log.info("执行结束");
long endTime = System.currentTimeMillis();
log.info("方法执行时间:" + (endTime - startTime)/1000 + "秒");
return resultList;
//省略...
执行后的结果存放在resultList 中,具体代码实现需要结合实际情况完成。
继续更新呀,期待期待