坑位描述:
用线程池去跑批量任务,总共343个任务,newFixedThreadPool的设置corePoolSize为30。
即用 固定30个线程去消费343个任务,并且使用了AQS的发令枪(CountDownLatch)实现在所有任务都结束后,进行程序后续的操作。
由于每个任务里都涉及到图片上传云服务器、调用地图API解析商圈位置、地铁距离等一系列"高端"操作,受带宽限制挺大的(地图API里也有并发限制),故整个程序运行起来也是异常缓慢。
代码大概如下:
final int total=branchList.size();
final AtomicInteger process = new AtomicInteger(0);
final CountDownLatch latch = new CountDownLatch(branchList.size());
startTime = System.currentTimeMillis();
//用线程池并发执行
ExecutorService pool= Executors.newFixedThreadPool(threads);
for(final BranchEntity b:branchList){
pool.execute(new Runnable() {
@Override
public void run() {
try{
saveHouseInBranch(hs, total, process, b);
}catch(Exception e){
logger.error(e,e);
}finally{
latch.countDown();
}
}