zoukankan      html  css  js  c++  java
  • 多线程并发问题解决

    有这样一个需求:查询数据库里的多张表的数据量,并按从大到小的顺序排序。

    首先想到的就是按传统的做法,去循环查询每一张表的数据量,再放到一个集合进行排序。

    这样也能实现,但是查询速度太慢,如果有上百张表,且每张表都是上百万条数据量的,

    这样时间需要非常久,这个时候就要用到多线程了,充分调动CPU的资源。

     1     //创建线程池
     2     ExecutorService exe = Executors.newCachedThreadPool();
     3     //创建任务数组
     4     CompletableFuture[] list1 = new CompletableFuture[securityDictionaryFroms.size()];
     5     //循环创建任务并把任务加到任务数组
     6     for (int i = 0; i < securityDictionaryFroms.size(); i++) {
     7         SecurityDictionaryFrom securityDictionaryFrom = securityDictionaryFroms.get(i);
     8         //创建任务实现类实例
     9         CountTask countTask = new CountTask(securityDictionaryFrom.getDicValue(), getJdbcTemplate());
    10         //定义任务执行完成后需要进行的后续操作
    11         CompletableFuture completableFuture = CompletableFuture.supplyAsync(countTask, exe).whenComplete((result, e) -> {
    12             Temp temp = new Temp();
    13             temp.setTableNameCn(securityDictionaryFrom.getDicName());
    14             temp.setTableNameEn(securityDictionaryFrom.getDicValue());
    15             temp.setDataSum(result);
    16             list.add(temp);
    17         }).exceptionally((e) -> {
    18             e.printStackTrace();
    19             return 0;
    20         });
    21         //将任务加入任务数组
    22         list1[i] = completableFuture;
    23     }
    24     //将任务数组交给一个任务来调度
    25     CompletableFuture<Void> all = CompletableFuture.allOf(list1).thenApply(x -> {
    26         log.info("all");
    27         return null;
    28     });
    29     //阻塞直至所有任务都执行完成
    30     Void aVoid = all.get();
    31     //关闭线程池
    32     exe.shutdown();
    33     list2 = list;
    34     //对查询结果进行排序
    35     list2 = list2.stream().sorted(Comparator.comparing(Temp::getDataSum).reversed()).collect(Collectors.toList());
  • 相关阅读:
    linux系统分析工具续-SystemTap和火焰图(Flame Graph)
    如何使用strace+pstack利器分析程序性能
    MySQL数据类型-decimal详解
    服务器端数据合法性验证:签名sign和口令token原理
    linux系统下php通过php_oci8扩展连接oracle数据库 Nginx
    redis开启远程访问
    cURL函数库错误码说明之PHP curl_errno函数
    权限控制相关模块
    otool
    路由器
  • 原文地址:https://www.cnblogs.com/zhncnblogs/p/14818775.html
Copyright © 2011-2022 走看看