导入cn.hutool.core.util.RandomUtil;导入com.google.common.collect.Lists;导入lombok.AllArgsConstructor;导入lombok.Builder;导入lombok.Data;导入lombok.NoArgsConstructor;导入org.apache.commons.collections.CollectionUtils;导入org.junit.Test;导入org.springframework.util.StopWatch;导入java.math.BigDecimal;导入java.util.ArrayList;导入java.util.List;导入java.util.concurrent.CompletableFuture;导入java.util.concurrent.LinkedBlockingDeque;导入java.util.concurrent.ThreadPoolExecutor;导入java.util.concurrent.TimeUnit;导入java.util.stream.Collectors;导入java.util.stream.IntStream;/***@authornieweijun*@since2022/2/2410:53*/publicclassTestCf{privatestaticfinalThreadPoolExecutorexecutor=newThreadPoolExecutor(20,100,3,TimeUnit.SECONDS,newLinkedBlockingDeque<>(512));@TestpublicvoidtestTotalAmount(){finalBigDecimal[]sum={newBigDecimal(0)};秒表opWatch=new秒表();stopWatch.start();//1.假设sku库存对象id为0到10000,首先初始化数据idListskuInventories=IntStream.rangeClosed(1,10000).boxed().map(i->SkuInventory.builder().id(String.valueOf(i)).build()).collect(Collectors.toList());//2.查询所有库存,计算总值//模拟每条数据:每次batch/100List>partitionsList=Lists.partition(skuInventories,100);//3.检查:使用异步ListcfList=newArrayList<>();CompletableFuture[]cfArray=newCompletableFuture[partitionsList.size()];partitionsList.stream().forEach(partition->{CompletableFuturefuture=CompletableFuture.runAsync(()->queryBatch(partition),executor);cfList.add(future);});CompletableFuture.allOf(cfList.toArray(cfArray)).join();//完成执行//4.统计skuInventories.stream().forEach(e->{BigDecimalmultiply=BigDecimal.valueOf(e.getCount()).multiply(e.getPrice());sum[0]=sum[0].add(multiply);});stopWatch.stop();System.out.println("结果为:"+sum[0]);System.out.println("耗时毫秒为:"+stopWatch.getTotalTimeMillis());}//模拟查询数据;设置数据值privatevoidqueryBatch(ListpartList){if(CollectionUtils.isEmpty(partList)){return;}longmillisCost=RandomUtil.randomInt(100,1000);//模拟查询消耗时间try{TimeUnit.MILLISECONDS.sleep(millisCost);}catch(InterruptedExceptione){e.printStackTrace();}//模拟赋值:每个数量为10,价格为1.0partList.stream().forEach(e->{e.setCount(10);e.setPrice(newBigDecimal("1.0"));});System.out.println("==========处理一批partList耗时["+millisCost+"ms]==========");}//sku库存对象@Builder@NoArgsConstructor@AllArgsConstructor@DatastaticclassSkuInventory{/**id*/privateStringid;/**库存数量*/privateIntegercount;/**单价*/privateBigDecimalprice;}}