java 异步汇总查询

以下是使用java 多线程查询数据 ,然后汇总返回的样例和实际使用方法

样例

    @GetMapping("getstocktop3info")
    public Result getstocktop3info(
            @RequestParam(value = "startDate", required = false) String startDate,
            @RequestParam(value = "endDate", required = false) String endDate
    ) throws ParseException {
       	//如果定义一个ArrayList
       	//需要加上Collections.synchronizedList()保证线程安全,防止溢出
       	//List<TestVo> resultList=Collections.synchronizedList(new ArrayList<>());
        List<Map> top3Map = erpStockService.getstocktopmanyinfo(3);
        //定义线程数量
        CountDownLatch ctl = new CountDownLatch(3);

        for (Map top : top3Map) {
			//新建线程
            new Thread(()->{
            	//代码块
            	//线程结束表结束一个线程
            	ctl.countDown();
                System.out.println("线程执行");
            }).start();
        }
        System.out.println("最后结束");
        //等待所有线程结束返回最终数据
        try {
            ctl.await();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return Result.OK(top3Map);
    }

实际使用方法

    @ApiOperation(value = "获取库存前三的车辆", notes = "获取库存前三的车辆")
    @GetMapping("getstocktop3info")
    public Result getstocktop3info(
            @RequestParam(value = "startDate", required = false) String startDate,
            @RequestParam(value = "endDate", required = false) String endDate
    ) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");

        Integer startT = null;
        Integer endT = null;

        String startDateTime = null;
        String endDateTime = null;
        if (startDate != null && endDate != null) {
            Date startTime = DateUtils.strToDate2(startDate);
            Date endTime = DateUtils.strToDate2(endDate);
            startT = Integer.parseInt(sdf.format(startTime));
            endT = Integer.parseInt(sdf.format(endTime));

            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            SimpleDateFormat daydf = new SimpleDateFormat("yyyy-MM-dd");

            startDateTime = df.format(daydf.parse(startDate));
            endDateTime = df.format(daydf.parse(endDate));
        }
        List<Map> top3Map = erpStockService.getstocktopmanyinfo(3);

        CountDownLatch ctl = new CountDownLatch(3);
        for (Map top : top3Map) {

            //获取这个车系的上险量的城市饼状图
            List<Map> insuranceNumber = ycUpperService.getpurchaseInsuranceNumber((Integer) top.get("series_id"), startT, endT);

            Map deleteMap=null;

            for (Map inNumber:insuranceNumber){
                if (inNumber.get("name")==null){
                    top.put("specc",inNumber.get("number"));
                    deleteMap=inNumber;
                }
            }
            if (deleteMap!=null){
                insuranceNumber.remove(deleteMap);
            }
            insuranceNumber = insuranceNumber.size() < 1 ? null : classifyOthers(insuranceNumber);
            //赋值上线量总数
            top.put("insuranceNumber", insuranceNumber);


            String finalStartDateTime = startDateTime;
            String finalEndDateTime = endDateTime;
            new Thread(()->{
            //获取这个车型的成交城市排名
            List<Map> buyNumber = nKoubeiService.getseriesTradingCityTop((Integer) top.get("series_id"), 3, finalStartDateTime, finalEndDateTime);
            top.put("buyNumber", buyNumber);
            ctl.countDown();
                System.out.println("线程执行");
            }).start();
//            //获取这个车型的成交城市排名
//            List<Map> buyNumber = nKoubeiService.getseriesTradingCityTop((Integer) top.get("series_id"), 3, startDateTime, endDateTime);
//            top.put("buyNumber", buyNumber);

        }
        System.out.println("最后结束");
        //等待所有线程结束返回最终数据
        try {
            ctl.await();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return Result.OK(top3Map);
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Spring Boot异步查询数据库的示例代码: 1.在Spring Boot应用程序的主类上添加@EnableAsync注释,以启用异步方法执行。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 2.在需要异步执行的方法上添加@Async注释。 ```java import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service public class UserService { @Async public CompletableFuture<User> findUserById(Long id) { // 异步查询数据库 User user = userRepository.findById(id); return CompletableFuture.completedFuture(user); } } ``` 3.在调用异步方法时,使用CompletableFuture来处理异步结果。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) throws ExecutionException, InterruptedException { CompletableFuture<User> future = userService.findUserById(id); User user = future.get(); return user; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值