多线程的应用

实例说明,有一个庞大的实例的list集合,如果我们把它插入数据库。可以用多线程的思路解决。这样可以让插入操作继续在后台执行,不妨碍程序往下执行。用户不必等待。

    private void insertDetailByXiancheng(
            List<AdminDataContentDetail> dataContentDetailList) {
        int pageSize = 50, totalPage = 0;
        totalPage = dataContentDetailList.size() / pageSize;
        if (dataContentDetailList.size() % pageSize > 0) {
            totalPage++;
        }
        for (int page = 0; page < totalPage; page++) {
            List<AdminDataContentDetail> currentData = new ArrayList<AdminDataContentDetail>();
            if (page == totalPage - 1) {
                currentData = dataContentDetailList.subList(page * pageSize, dataContentDetailList.size());
            } else {
                currentData = dataContentDetailList.subList(page * pageSize, page * pageSize + pageSize);
            }
            //通过线程 并发执行  但是由于并发太多 需要主动休眠(效率比顺序执行高)

            Thread rthread = new Thread(new ScanToinsertDetail(currentData,contentDetailService));
            rthread.start();
            //必须休眠 不然线程太多会报错
            //Thread.sleep(2000);
        }
    }

把list集合分割交由一个线程执行,提高效率。

/**
 * 對多量的新增表信息進行多線程處理
* @author doushuihai  
* @date 2018年7月5日上午11:22:30  
* @TODO
 */
public class ScanToinsertDetail  implements Runnable {
    List<AdminDataContentDetail> dataContentDetailList ;// 获取新增的表信息
    private IAdminDataContentDetailService contentDetailService;

    public ScanToinsertDetail(List<AdminDataContentDetail> dataContentDetailList,
            IAdminDataContentDetailService contentDetailService) {
        super();
        this.dataContentDetailList = dataContentDetailList;
        this.contentDetailService = contentDetailService;
    }

    public void run() {        
        contentDetailService.insertByBatch(dataContentDetailList);
        //itablescan.DatasourceConfigService.toTableScan(id, user);
    }

    
}

 

多线程里的contentDetailService由于传入问题,无法在ScanToinsertDetail类里直接获取。(可能是我对Spring理解不深,菜~~)。涉及不到这的可以忽略


posted @ 2018-07-10 16:26  爱吃香蕉和菠萝  阅读(146)  评论(0编辑  收藏  举报