创建了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();

解决方案 »

  1.   

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

  2.   

    从所贴出来程序并没看出问题,必须更深层次的看看其它被调函数。
    另外建议可以这样排查:public Object call() throws Exception {
            for (int i = 0; i < listHotelId.size(); i++) {
                HotelEntity hotelId = (HotelEntity) listHotelId.get(i);
                // hotelDao.modifyHotelEntity(hotelId); // 注释掉这句话,看看是否还会如此?
            }
            return "";
    }