配置线程池
public class ChangeMsgThreadPool {
private static ThreadPoolTaskExecutor executor=null;
public static ThreadPoolTaskExecutor getPoolInstance() {
try {
executor =new ThreadPoolTaskExecutor();
executor.setCorePoolSize(6);//设置核心线程数
executor.setMaxPoolSize(10);//设置最大线程数
executor.setKeepAliveSeconds(20);//除核心线程外的线程存活时间
executor.setQueueCapacity(10);//任务缓存队列
//设置线程拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程初始化
executor.initialize();
return executor;
} catch (Exception e) {
executor.setCorePoolSize(3);
executor.setMaxPoolSize(5);
executor.setKeepAliveSeconds(60);
executor.setQueueCapacity(20);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
}
return executor;
}
/**
* 数据同步多线程
*/
public List<String> getDatasynchronization() {
try {
//远程调用外部接口将数据封装到一个list中
List<BaseSiteModel> list=getBaseSiteList();
//将集合设置为线程安全的
List<BaseSiteModel> baseSiteList=Collections.synchronizedList(list);
ThreadPoolTaskExecutor executor = ChangeMsgThreadPool.getPoolInstance();
//new CountDownLatch(n) 将CountDownLatch的计数器初始化为n
final CountDownLatch countDownLatch=new CountDownLatch(baseSiteList.size());
for (BaseSiteModel baseSiteModel : baseSiteList) {
executor.execute(new TranDataRunnable(baseSiteModel,baseSiteList,countDownLatch));
}
countDownLatch.await();
return null;
} catch (InterruptedException e) {
}
return null;
}
/**
*
* 内部类
*
*/
private final class TranDataRunnable implements Runnable {
private BaseSiteModel baseSiteModel;
private List<BaseSiteModel> listMap;
private CountDownLatch countDownLatch;
public TranDataRunnable (BaseSiteModel baseSiteModel, List<BaseSiteModel> listMap, CountDownLatch countDownLatch) {
this.baseSiteModel=baseSiteModel;
this.listMap=listMap;
this.countDownLatch=countDownLatch;
}
public void run() {
try {
//需要用线程的方法
saveSiteDatas(baseSiteModel,listMap,countDownLatch);
} catch (Exception e) {
ResponsModel.success();
}finally {
//每当一个任务线程执行完毕,就将计数器减1
//当计数器的值变为0时,在CountDownLatch上 await() 的线程就会被唤醒
countDownLatch.countDown();
}
}
}
/**
* 使用多线程的方法
* @param baseSiteModel
* @param listMap
* @param countDownLatch
*/
public void saveSiteDatas(BaseSiteModel baseSiteModel, List<BaseSiteModel> listMap, CountDownLatch countDownLatch) {
//将组装的数据入库
staticMapper.saveData(listMap);
}