ExecutorConfig配置类
@Configuration
@EnableAsync
public class ExecutorConfig implements AsyncConfigurer {
@Bean
@Override
public Executor getAsyncExecutor(){
System.out.println("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(5);
// 设置最大线程数
executor.setMaxPoolSize(20);
// 设置队列容量
executor.setQueueCapacity(20);
// 设置线程活跃时间(秒)
executor.setKeepAliveSeconds(60);
// 设置默认线程名称
executor.setThreadNamePrefix("hello Thread-");
// 设置拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler();
}
}
AsyncService接口
/**
* 异步服务接口
*
*/
public interface AsyncService {
/*自定义接口*/
void ClassifiedimportItem(List<ClassifiedDrawActivityUserjoin> classifiedDrawActivityUserjoinList, String fatherUniqueNumber);
}
AsyncServiceImpl
@Service
public class AsyncServiceImpl implements AsyncService {
@Autowired
private ClassifiedDrawActivityUserJoinService ClassifiedDrawActivityUserJoinService;
@Async
@Override
public void ClassifiedimportItem(List<ClassifiedDrawActivityUserjoin> List, String fatherUniqueNumber) {
System.out.println(
Thread.currentThread().getName() + "\t" + Thread.currentThread().getId() + "\t" + "执行了线程任务"
);
//Add your code
ClassifiedDrawActivityUserJoinService.importItem(List,fatherUniqueNumber);
}
}
Controller
@Autowired
AsyncService asyncService;
//每个线程处理的数据量
private static final int deviceCount = 5000;
//处理数据
public static List<List<ClassifiedDrawActivityUserjoin>> createList(List<ClassifiedDrawActivityUserjoin> target, int size) {
//新建返回 list
List<List<ClassifiedDrawActivityUserjoin>> listArr = new ArrayList<List<ClassifiedDrawActivityUserjoin>>();
//获取被拆分的数组个数
int arrSize = target.size() % size == 0 ? target.size() / size : target.size() / size + 1;
System.out.println(arrSize+"个数组/线程");
//依次处理arrSize个数组
for (int i = 0; i < arrSize; i++) {
//新建sublist
List<ClassifiedDrawActivityUserjoin> sub = new ArrayList<ClassifiedDrawActivityUserjoin>();
//把将size个数据放入到sublist中
for (int j = i * size; j <= size * (i + 1) - 1; j++) {
if (j <= target.size() - 1) {
sub.add(target.get(j));
}
}
//添加到listArr
listArr.add(sub);
}
//返回listArr-包含arrSize个list
return listArr;
}
@Transactional(rollbackFor = Exception.class)
@PostMapping("/importItem")
@ResponseBody
public ApiRestResponse importUser(HttpSession session, @RequestParam("data") String requestData,@RequestParam("fatherUniqueNumber") String fatherUniqueNumber) {
try {
//2.1数据判断
if (classifiedDrawActivityUserjoinList.size() <= deviceCount) {
asyncService.ClassifiedimportItem(classifiedDrawActivityUserjoinList,fatherUniqueNumber);
} else {
List<List<ClassifiedDrawActivityUserjoin>> listNew = createList(classifiedDrawActivityUserjoinList, deviceCount);
for (List<ClassifiedDrawActivityUserjoin> i : listNew) {
/* 异步处理 */
asyncService.ClassifiedimportItem(i,fatherUniqueNumber);
//System.out.println("调用"+i+"个线程");
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.println(e.toString() + " 错误所在行数:" + e.getStackTrace()[0].getLineNumber());
}
}