实例说明,有一个庞大的实例的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理解不深,菜~~)。涉及不到这的可以忽略