日期:2014-05-20  浏览次数:20734 次

Callable多线程问题,求高手解答!谢谢。
创建了5个线程处理4.5W条数据入库操作, 给这每个线程处理1W条,当5个线程中的一个线程运行结束时候,其他线程也不执行了。TOMCAT没死,程序其他操作还在执行,就是线程池中的其他4个线程不继续执行下去了。。。

线程操作类
Java code


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 "";
    }
}




调用类
Java code


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();



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

------解决方案--------------------
从所贴出来程序并没看出问题,必须更深层次的看看其它被调函数。


另外建议可以这样排查:

public Object call() throws Exception {
for (int i = 0; i < listHotelId.size(); i++) {
HotelEntity hotelId = (HotelEntity) listHotelId.get(i);
// hotelDao.modifyHotelEntity(hotelId); // 注释掉这句话,看看是否还会如此?
}
return "";
}