ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java多线程分片数据处理

2022-07-11 15:03:26  阅读:201  来源: 互联网

标签:Java int List 分片 new 多线程 数据 partitions


java对于数据量较大的数据插入处理或者业务逻辑调用多个远程接口出现性能瓶颈,如何用多线程优化

示例一、对于插入百万级批量数据的处理

1、基于java jdk并发包的实现数据分片处理
//线程池的定义
    private static final int corePoolSize = Runtime.getRuntime().availableProcessors();
    private static final int maximumPoolSize = corePoolSize * 4 + 1;
    private static final ExecutorService executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
            3L, TimeUnit.HOURS,
            new ArrayBlockingQueue<>(10000), new DefaultThreadFactory("async-data-worker"),
            new ThreadPoolExecutor.CallerRunsPolicy());
//业务数据分片 List<T> datas= ...获取业务数据,若数据量过大,可以只获取id集分片,然后再查询整个model数据处理 List<List<T>> partitions = Lists.partition(datas, 1000); List<CompletableFuture> futures = new ArrayList<>(); for (int i = 0; i < partitions.size(); i++) { List<T> pDatas = partitions.get(i); final int j =i; futures.add(CompletableFuture.supplyAsync(() -> saveBatch(pDatas), executorService)
//不需要处理返回值不需要执行thenAccept方法 .thenAccept((s) -> results.add(j))); } // CompletableFuture.allOf(futures.stream().toArray(CompletableFuture[]::new)).join();//不需要后续处理直接join等待所有子任务执行完成 CompletableFuture.allOf(futures.stream().toArray(CompletableFuture[]::new)).thenRun(() -> { results.forEach(item->{ log.info("批量数据执行结果={}",item); }); }).get();

从log打印的结果来看,整个返回的结果数据集是无序的

2、基于Google 的Guava的并发包实现数据分片处理

//业务数据分片
                List<T> datas= ...获取业务数据,若数据量过大,可以只获取id集分片,然后再查询整个model数据处理

                List<List<T>> partitions = Lists.partition(datas, 1000);
                // 定义监听执行服务
                ListeningExecutorService listeningExecutorService =
                        MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
                List<ListenableFuture<Integer>> listenableFutures = new ArrayList<>();
for (int i = 0; i < partitions.size(); i++) { List<T> pDatas= partitions.get(i); final int j =i; listenableFutures.add(listeningExecutorService.submit(()->{ saveBatch(pDatas); return j; })); } ListenableFuture<List<Integer>> listListenableFuture = Futures.allAsList( Lists.newArrayList(listenableFutures)); List<Integer> lists = listListenableFuture.get(); lists.forEach(item->{ System.out.println(item); });

Guava的实现是要简洁一些的,从log打印的结果来看,整个返回的结果数据集是有序的

多接口并行调用用多线程优化也是同理

标签:Java,int,List,分片,new,多线程,数据,partitions
来源: https://www.cnblogs.com/flgb/p/16466359.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有