重點:
1. 創建線程池
Executor executor = Executors.newCachedThreadPool();//保存線程List<CompletableFuture<Void>> futures = new ArrayList<>();
2.使用
//這里可以是多個看下面代碼是在for中使用的
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {},executor );
3.等待所有線程執行完畢
futures.add(future);
4.等待所有線程執行完畢
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
byTimelist方法:
在這個byTimelist方法示例中,我們使用CompletableFuture.supplyAsync()將每個vehicleStatisticsMapper.chuchelist(chuchelistVo)方法調用包裝起來,并返回一個CompletableFuture,其中結果的類型為Long。
然后,我們在相應的位置獲取異步任務的結果,使用get()方法阻塞當前線程,直到結果可用。
package com.ruoyi.system.service.vehiclestatistics;import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.vo.ChuchelistVo;
import com.ruoyi.system.domain.vo.VehicleStatisticsVo;
import com.ruoyi.system.mapper.vehiclestatistics.VehicleStatisticsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;@Service
public class VehicleStatisticsServiceimpl implements VehicleStatisticsService {@AutowiredVehicleStatisticsMapper vehicleStatisticsMapper;@Overridepublic List<VehicleStatisticsVo> byTimelist(String startTime, String endTime) {List<VehicleStatisticsVo> vehicleStatisticsVos = vehicleStatisticsMapper.byTimelist(startTime, endTime);List<CompletableFuture<Void>> futures = new ArrayList<>();/*** 使用線程池的工廠方法創建線程池(會自動設置線程的數量大小)*/Executor executor = Executors.newCachedThreadPool();for (VehicleStatisticsVo vehicleStatisticsVo : vehicleStatisticsVos) {CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {ChuchelistVo chuchelistVo = new ChuchelistVo();chuchelistVo.setStartTime(startTime);chuchelistVo.setEndTime(endTime);chuchelistVo.setDeptid(Long.valueOf(vehicleStatisticsVo.getBmId()));chuchelistVo.setChsingletype("值班");CompletableFuture<Long> zhibanFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size(),executor);chuchelistVo.setChsingletype("緊急");CompletableFuture<Long> jjChucheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size(),executor);chuchelistVo.setChsingletype("正常");CompletableFuture<Long> chuCheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size(),executor);ChuchelistVo chuchelistVo2 = new ChuchelistVo();chuchelistVo2.setStartTime(startTime);chuchelistVo2.setEndTime(endTime);chuchelistVo2.setLongAndShortparame("and cc.sempid=0");chuchelistVo2.setDeptid(Long.valueOf(vehicleStatisticsVo.getBmId()));CompletableFuture<Long> dtChucheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist2(chuchelistVo2).size(),executor);chuchelistVo2.setLongAndShortparame("and cc.sempid!=0");CompletableFuture<Long> ctChucheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist2(chuchelistVo2).size(),executor);try {vehicleStatisticsVo.setZhiban(zhibanFuture.get());vehicleStatisticsVo.setJjChuche(jjChucheFuture.get());vehicleStatisticsVo.setChuChe(chuCheFuture.get());vehicleStatisticsVo.setDtChuche(dtChucheFuture.get());vehicleStatisticsVo.setCtChuche(ctChucheFuture.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}},executor);futures.add(future);}CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();return vehicleStatisticsVos;}@Overridepublic AjaxResult bytypelist(ChuchelistVo chuchelistVo1) {Map<String, Object> ms = new HashMap<>();Map<String, Object> rs = new HashMap<>();Map<String, Object> rs2 = new HashMap<>();ChuchelistVo chuchelistVo = new ChuchelistVo();chuchelistVo.setStartTime(chuchelistVo1.getStartTime());chuchelistVo.setEndTime(chuchelistVo1.getEndTime());chuchelistVo.setChsingletype(chuchelistVo1.getChsingletype());for (Long deptid : chuchelistVo1.getDeptids()) {chuchelistVo.setDeptid(deptid);rs2.put("部門id", deptid);rs2.put("部門名稱", vehicleStatisticsMapper.chuchelist(chuchelistVo).size() > 0 ? vehicleStatisticsMapper.chuchelist(chuchelistVo).get(0).getDeptname() : ("" + deptid));rs2.put("listsize", (long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size());rs2.put("list",vehicleStatisticsMapper.chuchelist(chuchelistVo));rs.put(vehicleStatisticsMapper.chuchelist(chuchelistVo).size() > 0 ? vehicleStatisticsMapper.chuchelist(chuchelistVo).get(0).getDeptname() : ("" + deptid),rs2);}ms.put("result", rs);ms.put("startTime", chuchelistVo.getStartTime());ms.put("endTime", chuchelistVo.getEndTime());return AjaxResult.success(ms);}@Overridepublic AjaxResult bylongandshortparamelist(ChuchelistVo chuchelistVo1) {Map<String, Object> ms = new HashMap<>();Map<String, Object> rs = new HashMap<>();Map<String, Object> rs2 = new HashMap<>();ChuchelistVo chuchelistVo = new ChuchelistVo();chuchelistVo.setStartTime(chuchelistVo1.getStartTime());chuchelistVo.setEndTime(chuchelistVo1.getEndTime());if (chuchelistVo1.getLongAndShortparame() != null) {if ("長途".equals(chuchelistVo1.getLongAndShortparame())) {chuchelistVo.setLongAndShortparame("and cc.sempid=0");}if ("短途".equals(chuchelistVo1.getLongAndShortparame())) {chuchelistVo.setLongAndShortparame("and cc.sempid!=0");}}for (Long deptid : chuchelistVo1.getDeptids()) {chuchelistVo.setDeptid(deptid);List<ChuchelistVo> chuchelistVos = vehicleStatisticsMapper.chuchelist2(chuchelistVo);rs2.put(chuchelistVos.size() > 0 ? chuchelistVos.get(0).getDeptname() : ("" + deptid), (long) chuchelistVos.size());rs2.put("部門id", deptid);rs2.put("部門名稱", chuchelistVos.size() > 0 ? chuchelistVos.get(0).getDeptname() : ("" + deptid));rs2.put("listsize", chuchelistVos.size());rs2.put("list", chuchelistVos);rs.put(chuchelistVos.size() > 0 ? chuchelistVos.get(0).getDeptname() : ("" + deptid), rs2);}ms.put("result", rs);ms.put("startTime", chuchelistVo.getStartTime());ms.put("endTime", chuchelistVo.getEndTime());return AjaxResult.success(ms);}}