多线程执行插入,越执行越慢

西门呀在吹雪 2016-04-12 09:42:55
在循环中调用线程执行
for(int i=0;i<index;i+=pagesize){
Long timeStart_queryPortalIdAll_page=System.currentTimeMillis();
// logger.info("分页处理中"+(currentPage+i)+"------------"+(pagesize+currentPage+i));
if((pagesize+currentPage+i)>index){
//特殊处理截取值大于list.size() 情况
Map<String,Object> mapHelper=new HashMap();
mapHelper.put("index",2);//threadPoolTaskExecutorInsert线程中2代表节目插入
mapHelper.put("params",containsList.subList((currentPage+i),index));
mapHelper.put("cmsCategoryContainInfoDaoTarget", cmsCategoryContainInfoDaoTarget);
mapHelper.put("dbName",configService.CONSTANT_DB_NAME_PREFIX);
mapHelper.put("tableName",configService.CONSTANT_TABLE_NAME_CATEGORYCONTAININFO+portalid);
threadPoolTaskExecutorInsert.execute(new InsertDataThreadNew(mapHelper));
// cmsCategoryContainInfoDaoTarget.insert(containsList.subList((currentPage+i),index), configService.CONSTANT_DB_NAME_PREFIX, configService.CONSTANT_TABLE_NAME_CATEGORYCONTAININFO+portalid);

}else{
// cmsCategoryContainInfoDaoTarget.insert(containsList.subList((currentPage+i),(pagesize+currentPage+i)), configService.CONSTANT_DB_NAME_PREFIX, configService.CONSTANT_TABLE_NAME_CATEGORYCONTAININFO+portalid);
Map<String,Object> mapHelper=new HashMap();
mapHelper.put("index",2);//threadPoolTaskExecutorInsert线程中2代表节目插入
mapHelper.put("params",containsList.subList((currentPage+i),(pagesize+currentPage+i)));
mapHelper.put("cmsCategoryContainInfoDaoTarget", cmsCategoryContainInfoDaoTarget);
mapHelper.put("dbName",configService.CONSTANT_DB_NAME_PREFIX);
mapHelper.put("tableName",configService.CONSTANT_TABLE_NAME_CATEGORYCONTAININFO+portalid);
threadPoolTaskExecutorInsert.execute(new InsertDataThreadNew(mapHelper));
}
// logger.info("分页处理中"+(currentPage+i)+"------------"+(pagesize+currentPage+i)+LogTimerUtil.getOverTimeFormatStr(timeStart_queryPortalIdAll_page, System.currentTimeMillis()));
currentPage++;
}


run方法
public InsertDataThreadNew(Map<String,Object> mapHelper) {
super();
this.mapHelper = mapHelper;
}
@Override
public void run() {
try {
int index=(Integer) mapHelper.get("index");
if(index==1){
System.out.println("线程启动成功!");
ITableDaoTarget tableDaoTarget=(ITableDaoTarget) mapHelper.get("tableDaoTarget");
List<CmsCategoryInfoSource> childrenList=(List<CmsCategoryInfoSource>) mapHelper.get("mapHelper");
String dbName=mapHelper.get("dbName").toString();
String tableName=mapHelper.get("tableName").toString();
tableDaoTarget.insert(childrenList, dbName, tableName);
}else if(index==2){
List<CmsCategoryContainInfoSource> containsList=(List<CmsCategoryContainInfoSource>) mapHelper.get("params");
ITableDaoTarget cmsCategoryContainInfoDaoTarget=(ITableDaoTarget) mapHelper.get("cmsCategoryContainInfoDaoTarget");
String dbName=(String) mapHelper.get("dbName");
String tableName=(String) mapHelper.get("tableName");
cmsCategoryContainInfoDaoTarget.insert(containsList, dbName, tableName);
}else{
System.out.println("----");
}
System.out.println(Thread.activeCount()+"---活跃线程统计-");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


我定义的是10个插入线程,循环执行到第10个后,系统执行的就越来越慢了,控制台日志要好久才能滚动一次
...全文
518 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
西门呀在吹雪 2016-04-20
  • 打赏
  • 举报
回复
最后我发现执行慢的原因是,有个全局变量疯狂变大导致的,改成局部变量后一切正常了
  • 打赏
  • 举报
回复
监控下线程,看看每个线程的耗时和原因
家里敷泥呀 2016-04-12
  • 打赏
  • 举报
回复
先定位一下,那句程序的耗时严重
豫让_______ 2016-04-12
  • 打赏
  • 举报
回复
我觉得是你的线程池给得太小了,你10个线程放到只有5的池里肯定慢撒。。。而且插入数据并不是线程越多越高效。或者数据库连接池的问题?
Intboy 2016-04-12
  • 打赏
  • 举报
回复
引用 2 楼 shijing266 的回复:
监控下线程,看看每个线程的耗时和原因
+1

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧