Callable多线程问题,求高手解答!谢谢。

皮皮虾向前冲 2012-07-27 01:06:03
创建了5个线程处理4.5W条数据入库操作, 给这每个线程处理1W条,当5个线程中的一个线程运行结束时候,其他线程也不执行了。TOMCAT没死,程序其他操作还在执行,就是线程池中的其他4个线程不继续执行下去了。。。

线程操作类


public class HotelDetailThread implements Callable {
private static final Logger log = Logger.getLogger(HotelDetailThread.class);
private HotelDao hotelDao;
private List listHotelId;
private String index;

public HotelDetailThread(List listHotelId, String index,HotelDao hotelDao) {
this.listHotelId = listHotelId;
this.index = index;
this.hotelDao = hotelDao;
}

public Object call() throws Exception {
for (int i = 0; i < listHotelId.size(); i++) {
HotelEntity hotelId = (HotelEntity) listHotelId.get(i);
hotelDao.modifyHotelEntity(hotelId); // 执行更新操作
}
return "";
}
}



调用类


ExecutorService pool = Executors.newCachedThreadPool();
for (int i = 1; i <= maxPage; i++) {
PageListBean bean = new PageListBean();
bean.setCurrentPage(i);
List pagerList = bean.getPaper(listStr, pageSize);
Callable c = new HotelDetailThread(pagerList, i+"",hotelDao);
pool.submit(c);
}
pool.shutdown();
...全文
172 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuxiali 2012-07-27
  • 打赏
  • 举报
回复
4.5W条数数据亮并不大,没必要使用多线程。再加之你向同一个数据库中写数据,数据库链接很费资源的,反而会使效率下降。我建议你不如使用批处理,4.5W条最多也就1分钟搞定了!
MiceRice 2012-07-27
  • 打赏
  • 举报
回复
从所贴出来程序并没看出问题,必须更深层次的看看其它被调函数。


另外建议可以这样排查:

public Object call() throws Exception {
for (int i = 0; i < listHotelId.size(); i++) {
HotelEntity hotelId = (HotelEntity) listHotelId.get(i);
// hotelDao.modifyHotelEntity(hotelId); // 注释掉这句话,看看是否还会如此?
}
return "";
}
HelloKata 2012-07-27
  • 打赏
  • 举报
回复
你用什么方式访问数据库?

qybao 2012-07-27
  • 打赏
  • 举报
回复
hotelDao.modifyHotelEntity(hotelId);
是不是会更新一些共同资源?而死掉的线程因为锁住了某条记录没有释放,导致其他线程没法更新,必须等待死掉的线程释放锁

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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