多线程开发遇到的问题
最近在用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.没有创建线程池:执行这个方法的一个很大弊端是会不断的创建线程,不断销毁线程,会影响性能,解决方法是创建一个线程池。网上方法很多。