Chaos2018

多线程开发遇到的问题

最近在用java8的多线程技术进行开发的时候遇到一些问题,下面记录一下:

1 public void test(){
2 CompletableFuture<Map<String,Object>> cfA = CompletableFuture.supplyAsync(()->{
3      //此处为逻辑处理
4 });
5 CompletableFuture<Map<String,Object>> cfB = CompletableFuture.supplyAsync(()->{
6      //此处为逻辑处理
7 });
//cfC,cfD,cfE省略
CompletableFuture<Void> future = CompletableFuture.allOf(cfA,cfB,cfC,cfD,cfE);
future.join();
8 }

当时我面临的需求是把五个串行的接口改为五个并行的接口,然后将五个接口的查询结果合并起来。上面的代码是我写的代码简略版,我的代码存在如下问题:
1.对象没有克隆:五个线程处理同一个对象,相互之间会影响,所以我的执行结果一直在变化。解决办法是将对象克隆出五个副本,每个线程利用对象的副本处理逻辑,五个线程执行结束以后,将五个副本的结果合并到主对象上,返回结果。

2.没有创建线程池:执行这个方法的一个很大弊端是会不断的创建线程,不断销毁线程,会影响性能,解决方法是创建一个线程池。网上方法很多。

posted on 2019-08-30 08:38  Chaos2018  阅读(405)  评论(0编辑  收藏  举报

导航