原理:开启线程,并实现Callable接口
一、线程池
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池
*
* @author ht
*
*/
public class ThreadPoolEx {
public static ThreadPoolExecutor tPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(3);
/**
* 初始化线程池
*
*/
public ThreadPoolEx() {
}
public static ThreadPoolExecutor getInstance() {
if (tPool == null) {
tPool = (ThreadPoolExecutor) Executors.newCachedThreadPool();
}
return tPool;
}
}
二、代码执行
private ThreadPoolExecutor pool = ThreadPoolEx.getInstance();
/**
* 循环--拉取并存库
* @param totalPages
* @param startDate
* @param endDate
*/
private void getRequestPriceChange(Integer totalPages, String startDate, String endDate){
List<Future<List<T>>> futureList = new ArrayList<>();
for (int currentPageIndex = 2; currentPageIndex <= totalPages; currentPageIndex++) {
PullChangePriceTask priceTask = new PullChangePriceTask(pool, this, startDate, endDate, currentPageIndex);
Future<List<T>> roomPriceInfoFuture = pool.submit(priceTask);
futureList.add(roomPriceInfoFuture);
}
List<T> rateChangeInfos = new ArrayList<>();
for (Future<List<T>> ctripResponseFuture : futureList) {
List<T> rateChangeInfo = null;
try {
rateChangeInfo = ctripResponseFuture.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
rateChangeInfos.addAll(rateChangeInfo);
}
}
三、线程
import com.ctrip.entity.response.hotel.pice.change.RateChangeInfo;
import com.ctrip.spring.utils.exception.MsgException;
import com.ctrip.web.manage.controller.hotel.PriceController;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @Author: Jr
* @Description:
* @Date:Createc in 上午11:34 2018/11/27
* @Modified By:
*/
public class PullChangePriceTask implements Callable<List<RateChangeInfo>> {
ThreadPoolExecutor taskExecutor;
private PriceController priceController;
private String startDate;
private String endDate;
private int currentPageIndex;
public PullChangePriceTask(ThreadPoolExecutor taskExecutor, PriceController priceController, String startDate, String endDate, int currentPageIndex) {
this.taskExecutor = taskExecutor;
this.priceController = priceController;
this.startDate = startDate;
this.endDate = endDate;
this.currentPageIndex = currentPageIndex;
}
@Override
public List<RateChangeInfo> call() {
return priceController.pullChangePriceAndSave(startDate,endDate,currentPageIndex);
}
}