通过使用多线程来提升代码速度,可以将地址转换成经纬度的操作放入一个线程中进行处理。

具体代码如下所示:

@GetMapping("/queryCarsByCoachID")
public Result<Object> queryCarsByCoachID(Coach coach, HttpServletRequest request) {

    //权限验证
    String token = (String)request.getAttribute("claims_coach");
    if(token == null || "".equals(token)){
        throw new RuntimeException("权限不足!");
    }

    //把查询到的的对象放入map集合
    Map<String,Object> map = new HashMap<>();

    //调用方法查询出设备
    List<DeviceEntityDto> deviceEntityDtoList = coachService.queryDeviceEntitiesByCoachIdAndCarModel(coach.getCoachId());

    // 创建一个线程池
    ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    // 创建一个CountDownLatch,用于线程同步
    CountDownLatch countDownLatch = new CountDownLatch(deviceEntityDtoList.size());

    for (DeviceEntityDto deviceEntityDto : deviceEntityDtoList){
        executorService.execute(() -> {
            //获得此车辆的地址经纬度
            if (!StringUtils.isEmpty(deviceEntityDto.getArea())){
                Map<String,String> addressMap = tengXunMapService.getLongitudeAndLatitudeByAddress(deviceEntityDto.getArea());
                if (!CollectionUtils.isEmpty(addressMap)){
                    deviceEntityDto.setLongitude(addressMap.get("lng"));
                    deviceEntityDto.setLatitude(addressMap.get("lat"));
                }
            }

            //游戏端传递当前设备状态,显示状态(工作中/休息中)
            boolean existUser = ExternalCommunicationKit.existUser(deviceEntityDto.getDeviceId());
            deviceEntityDto.setWorkStatus(existUser ? 1 :0);

            // 线程执行完毕后,计数减一
            countDownLatch.countDown();
        });
    }

    try {
        // 等待所有线程执行完毕
        countDownLatch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        // 关闭线程池
        executorService.shutdown();
    }

    map.put("deviceEntities",deviceEntityDtoList);

    //查询到学员传给前端
    log.info("查询车辆成功!");
    return new Result<>(ResultCode.SUCCESS,map);
}

上述代码中,通过创建线程池和使用CountDownLatch来实现多线程处理地址转换操作。每个设备的地址转换操作被放入一个线程中执行,线程执行完毕后计数减一,最后等待所有线程执行完毕后关闭线程池。这样可以并发地处理地址转换,提高代码的执行速度

GetMappingqueryCarsByCoachID public ResultObject queryCarsByCoachIDCoach coach HttpServletRequest request 权限验证 String token = StringrequestgetAttributeclaims_coach; iftoken ==

原文地址: https://www.cveoy.top/t/topic/iw4o 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录