项目中线程池的应用

时间:2025-04-03 07:23:35

注意红色字体部分

业务需求:数据可能来自不同的数据源,mysql,oracle,或者远程接口(分为两个实现类:数据和api)

线程池调用

1.service层核心代码:

@Autowired

//数据和api的实现类,继承AbstractDataHanderService,AbstractDataHanderService为抽象类,

private Map<String,AbstractDataHanderService> handerServiceMap;

private ThreadPoolExecutor threadPool;

//下面初始化线程池

@PostConstruct

private void initThreadPool(){

 ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("engine-%d").setDaemon(true).build();

threadPool = new ThreadPoolExecutor(20,32,50L,,new LinkedBlockingQueue<Runnable>(32),threadFactory);

();

}

@Override

public List<IndicatorDataRespDTO> getIndicatorData(IndicatorReqDTO reqDTO,userCode){

  .....省略部分代码

 List<IndicatorDataDTO> dataDtoList = new ArrayList<>();  // 返回的结果

List<Future<List<IndicatorDataDTO>>> futures = new ArrayList<>();  //有返回结果的线程用future接收

for(){

//遍历调用数据或api的实现类,()就是得到实现service,

//getHandlerList方法封装要执行的对象

  List<AbstractGetDataHandler> handerList = (()+"_dataHandlerService")

  .getHandlerList(reqDTO,(),getGroupReqFields());

  ((handlerList));//这一步是真正的执行,执行的是上一步封装对象里的方法

}

//合并结果数据

  for(Future<List<IndicatorDataDTO>> future:futures){

   List<IndicatorDataDTO> resultDataList = ();

  if(!(resultDataList)){

    (resultDataList);

  }

 }

}

 

2. 注意上一段代码封装的执行对象 List<AbstractGetDataHandler> handerList =

和List<Future<List<IndicatorDataDTO>>> futures = new ArrayList<>();  //有返回结果的线程用future接收

 

AbstractGetDataHandler 抽象类:注意这里实现implements Callable<List<IndicatorDataDTO>>

@Slf4j

@Data

public abstract class AbstractGetDataHandler implements Callable<List<IndicatorDataDTO>>{

 public abstract List<IndicatorDataDTO> getIndicatorData(); //处理业务在这个方法的实现里面,

//注意这个方法的返回List<IndicatorDataDTO>和List<Future<List<IndicatorDataDTO>>> futures = new ArrayList<>();

}

 

3.实现类里getHandlerList方法核心代码

//返回List<AbstractGetDataHandler> dataHandlerList

//这里注意DataBaseGetDataHandler 继承了上面AbstractGetDataHandler ,并实现了getIndicatorData方法

//

  (new DataBaseGetDataHandler(jdbcTemplate,paramMap,dataPath,type,engineDbConfig));

 

4.DataBaseGetDataHandler

@Slf4j

@Data

@AllArgsConstructor

@NoArgsConstructor

public class DataBaseGetDataHandler extends AbstractGetDataHander{

//实现   getIndicatorData ,在这里业务处理

@Override

public List<IndicatorDataDTO> getIndicatorData(){

  。。。。。。

 }

//注意下面这个方法,重点!

@Override

public List<IndicatorDataDTO> call() thows Exception{

  return getIndicatorData

}

}