android多线程爬分页数据,分页获取数据+多线程下+CountDownLatch遇到的问题

问题说明

每20条分页获取完数据后,提交线程池进行任务处理,由于返回每页的条数小于20条,极端情况下每页只返回1条,这样每次只能提交一个任务,导致多线程弱化为单线程,任务执行时间剧增。

代码分析

原代码

Integer pageSize = 20;

for (int i = 1; i > 0; i++) {

//获取户型数据

HousePageDO layoutsByPage = getHousePageDO(startId,pageSize);

List list = layoutsByPage.getList();

log.info(LOG_PRE + "提交第" + i + "页数据,共" + list.size() + "条数据");

//注意当这里的list每次只有1条数据的时候,这时整个任务就弱化为单线程了

//提交任务

submitTasks(list,taskId,POOL);

//如果maxId为null 停止

if (layoutsByPage.getMaxId() == null) {

log.info(LOG_PRE + "获取到maxId为null,结束获取户型信息");

break;

}

//获取下一页开始id

startId = layoutsByPage.getMaxId();

}

private void submitTasks(List list,Long taskId,ExecutorService POOL) throws InterruptedException {

if(CollectionUtils.isNotEmpty(list)){

CountDownLatch begin = new CountDownLatch(list.size());

list.forEach(house -> {

//设置大区,业务组

resblockDictionaryHelper.setBusInfo(house,resblockMap);

POOL.execute(() -> {

try {

call(house);

}catch (Exception e){

e.printStackTrace();

TLayoutPriceTaskError error = TLayoutPriceTaskError.builder()

.createDatetime(new Date())

.layoutId(house.getLayoutId())

.msg(e.toString())

.param(house.getLayoutId() + "--" + house.getBeforeVersion() + "--" + house.getAfterVersion())

.taskTag(taskId).build();

layoutPriceTaskErrorMapper.insert(error);

}finally {

begin.countDown();

}

});

});

begin.await();

}

}

改后代码

//分页获取户型数据

Integer pageSize = 20;

List list = new ArrayList<>();

for (int i = 1; i > 0; i++) {

//获取户型数据

HousePageDO layoutsByPage = getHousePageDO(startId,pageSize);

log.info(LOG_PRE + "提交第" + i + "页数据,共" + layoutsByPage.getList().size() + "条数据");

if(!CollectionUtils.isEmpty(layoutsByPage.getList())){

list.addAll(layoutsByPage.getList());

}

//保证每次调价的任务大于一千

if(list.size() < 1000 && layoutsByPage.getMaxId() != null){

startId = layoutsByPage.getMaxId();

continue;

}

//提交任务

submitTasks(list,taskId,POOL);

//如果maxId为null 停止

if (layoutsByPage.getMaxId() == null) {

log.info(LOG_PRE + "获取到maxId为null,结束获取户型信息");

break;

}

//获取下一页开始id

startId = layoutsByPage.getMaxId();

list = new ArrayList<>();

}

原文:https://www.cnblogs.com/fangcheng2018/p/12898833.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值