1、自定义线程池
public class ThreadPoolTaskUtils {
private static int CAPACITY = 10000;
// 线程池核心线程数
public static int CORE_POOL_SIZE = 10;
// 线程池最大线程数
private static int MAXIMUM_POOL_SIZE = 30;
// 额外线程空状态生存时间
private static Long KEEP_ALIVE_TIME = 0L;
private static TimeUnit TIME_UNIT = TimeUnit.MILLISECONDS;
private static ExecutorService threadPool;
static {
BlockingQueue<Runnable> workingQueue = new ArrayBlockingQueue<Runnable>(CAPACITY);
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.AbortPolicy();
threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, workingQueue,
rejectedExecutionHandler);
}
/**
* 提交任务
*
* @param runnable
* @throws CommonException
*/
public static void execute(Runnable runnable) throws CommonException {
threadPool.execute(runnable);
}
}
使用示例:
for (int i = 0; i < 999; i++) {
ThreadPoolTaskUtils.submit(() -> {
//相关操作
});
}
2、使用guava包下的工具类
//dataList 为需要处理的数据集合
ListeningExecutorService les = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
List<ListenableFuture<List<PersonnelInfoModel>>> futures = Lists.newArrayList();
List<List<BeContorlInfoDto>> lists = Lists.partition(dataList, 999);
if (CollectionUtils.isNotEmpty(dataList)) {
dataList.stream().forEach(list -> {
ListenableFuture<List<PersonnelInfoModel>> future = les.submit(() -> personnelInfoService.countRedPersons(list));
futures.add(future);
});
}
List<List<PersonnelInfoModel>> personnelLists;
ListenableFuture<List<List<PersonnelInfoModel>>> successfulAsList = Futures.successfulAsList(futures);
try {
List<List<PersonnelInfoModel>> resultList = successfulAsList.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}