String tenantId = ThreadLocalContextManager.getRequestInfo().getCurrentTenantId(); List<SkuInfoVo> skuList = Lists.newArrayList(); int totalSize = skuIdList.size(); int pageSize = 5; // 每个线程查询20条商品数据 int totalPage = totalSize / pageSize; ExecutorService pool = Executors.newFixedThreadPool(totalPage+1); List<Future<List<SkuInfoVo>>> futureList = Lists.newArrayList(); for (int pageNum = 1; pageNum <= totalPage + 1; pageNum++) { int starNum = (pageNum - 1) * pageSize; int endNum = pageNum * pageSize > totalSize ? (totalSize) : pageNum * pageSize; List<Long> temList = skuIdList.subList(starNum, endNum); //查询环比数据 String storeCode1 = storeCode; Callable<List<SkuInfoVo>> callable = () -> getSkuInfoVos(temList,storeCode1,tenantId); Future<List<SkuInfoVo>> future = pool.submit(callable); futureList.add(future); } pool.shutdown(); // 不允许再想线程池中增加线程 try { //判断是否所有线程已经执行完毕 boolean isFinish = pool.awaitTermination(5, TimeUnit.MINUTES); //如果没有执行完 if (!isFinish) { //线程池执行结束 不在等待线程执行完毕,直接执行下面的代码 pool.shutdownNow(); } for (Future<List<SkuInfoVo>> future : futureList) { skuList.addAll(future.get()); } } catch (Exception e) { e.printStackTrace(); }
记录一次电商项目中线程池的应用
最新推荐文章于 2024-04-22 14:21:38 发布