多线程与线程问题。高分悬赏。 20C

线程池调用部分数据更新不到。因为调用外部接口需要等待时间,所有采用线程加快速度:代码如下:方案一、二 都会出现部分数据没有调用到数据或数据没有更新到数据库
方案一:
List logisticsTracesList=logisticsTraceService.updateLogisticsTraceOffline(params);// 只查询线下的物流信息
if(CollectionUtils.isNotEmpty(logisticsTracesList)){
Map> longListMap=getLogisticsTrace(logisticsTracesList);//一次分一千为一批
List list = new ArrayList();
for (Long aLong : longListMap.keySet()) {
list=longListMap.get(aLong);
}
Var var=new Var();
var.setSysVar(SystemConstants.LOGISTICS_TASK);//查询调用配置项
var=varService.getByExample(var);
Integer dealSize=100;
if(var!=null){
dealSize = Integer.parseInt(var.getSysVal());
}
int index = 0;
Integer count=(int)Math.ceil(list.size()/dealSize.doubleValue());
ExecutorService ex = Executors.newFixedThreadPool(count);
List>> futures = new ArrayList>>();
//分配
for(int i=0;i int start = index;
if(start>=list.size()) break;
int end = start + dealSize;
end = end>=list.size() ? list.size() : end;
LogisticsTraceTask logisticsTraceTask=new LogisticsTraceTask(list.subList(start,end),start,end);
logisticsTraceTask.setExpressConfigService(expressConfigService);
logisticsTraceTask.setLogisticsTraceService(logisticsTraceService);
futures.add(ex.submit(logisticsTraceTask));
}
try {
//处理
for(Future> future : futures){
System.out.println("=============="+future);
}
} catch (Exception e) {
e.printStackTrace();
}
}
方案二:
List logisticsTracesList=logisticsTraceService.updateLogisticsTraceOffline(params);// 只查询线下的物流信息
if(CollectionUtils.isNotEmpty(logisticsTracesList)){
Map> longListMap=getLogisticsTrace(logisticsTracesList);//一次分一千为一批
List list = new ArrayList();
for (Long aLong : longListMap.keySet()) {
list=longListMap.get(aLong);
}
Var var=new Var();
var.setSysVar(SystemConstants.LOGISTICS_TASK);//查询调用配置项
var=varService.getByExample(var);
Integer dealSize=500;//每个线程处理500条数据、可动态传入
if(var!=null){
dealSize = Integer.parseInt(var.getSysVal());
}
int index = 0;
Integer count=(int)Math.ceil(list.size()/dealSize.doubleValue());
if(count<=0){
count=1;
}
//分配
for(int i=0;i int start = index;
if(start>=list.size()) break;
int end = start + dealSize;
end = end>=list.size() ? list.size() : end;
LogisticsTraceTask logisticsTraceTask=new LogisticsTraceTask(list.subList(start,end),start,end);
logisticsTraceTask.setExpressConfigService(expressConfigService);
logisticsTraceTask.setLogisticsTraceService(logisticsTraceService);
logisticsTraceTask.start();
}
}

3个回答

LogisticsTraceTask这个任务有做增删链表的操作吗?

junjie_326168998
心梦无痕 有做增删改的数据库操作的
接近 2 年之前 回复

可能是并发的时候,资源的访问顺序不是你想象的。

这代码 粘贴的,看起来 真难受。。。 并发问题 最好把日志打全, 代码执行顺序 不是顺序的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!