Java 并行编程-性能改进
我正在用SpringBoot编写一个控制器,我的控制器是这样的Java 并行编程-性能改进,java,spring,multithreading,spring-boot,spring-mvc,Java,Spring,Multithreading,Spring Boot,Spring Mvc,我正在用SpringBoot编写一个控制器,我的控制器是这样的 @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") public MyDto getData throws Exception{ try{ Mydto=new MyDto(); dto.setFirstName(someImpl.getFirstName());
@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
public MyDto getData throws Exception{
try{
Mydto=new MyDto();
dto.setFirstName(someImpl.getFirstName());
dto.setLastName(someOtherImpl.getLastName());
dto.setAddress1(someImpl.getAddress1());
dto.setAddress2(someOtherImpl.getAddress2());
return dto;
}catch(){...}
这里的someImpl和someOtherImpl是包含某种方法声明的接口,我们从数据库中获取getFirstName和getLastName,但是getAddress1和getAddress2是硬编码值,如何设置前两个setter(firstname和lastname)在一个线程中运行,最后两个setter(Address1和Address2)在另一个线程中以视差方式运行,这样可以减少获取数据的时间
逻辑是这样的,SomeImpl将从数据库中获取15条记录,然后将这些记录发送给映射器,映射器将从15个字段中筛选出5个字段,然后将这5个值设置为Dto
您需要预先指定
从数据库中获取15条记录需要10秒。。太过分了。我还是猜问题出在别的地方,除非你证明不是这样
在这里,我们假设并行处理将对您有所帮助(线程切换和管理将比每个操作花费更少的时间)。请注意,从数据库并行读取数据可能对您的帮助比您预期的要小。换言之,这就是并行操作的方式,但我仍然不相信它能解决您的问题
您可以从评论中阅读参考资料
解决方案是使用CompletableFuture检索详细信息
并将其设置为dto。检查
详情请参见瓦伦丁·卡努
您可以将executor服务与固定线程池一起使用
private static final ExecutorService fetchService = Executors.newFixedThreadPool(threadCount);
提交你的任务
final Mydto myDto =new MyDto();
Collection<Future> futures = ...
futures.add(fetchService.submit(() -> { myDto.setSometing(...); }));
futures.add(fetchService.submit(() -> { myDto.setSometingElse(...); }));
// wait until all completes assuming no other thread submit tasks
futures.forEach(f->{f.get();});
final Mydto Mydto=new Mydto();
集合期货=。。。
futures.add(fetchService.submit(()->{myDto.setSometing(…);}));
futures.add(fetchService.submit(()->{myDto.setSometingElse(…);}));
//假设没有其他线程提交任务,请等待所有任务完成
forEach(f->{f.get();});
我从头开始写的,没有正确地验证语法,但是你应该有这样的想法使用多个线程并不能加快验证速度。上下文切换的成本将远远超过进行几个方法调用的琐碎成本(除非您在setter中做了大量工作)。更重要的是,为什么您认为线程应该使其更快?通过类比:如果您有两辆车沿着一条路行驶,修建另一条路不会帮助这些车更快到达那里。首先,你必须等到道路建成;然后你必须把车开到另一条路上;汽车仍然只能以相同的最高速度行驶;等等。如果需要10秒,那么问题就完全不同了。到底(!)需要10秒吗?它不可能是二传者自己。连接到数据库?外部服务?@Valentonunu:这家伙在某个地方有大约10秒的延迟,没有线程可以帮助他。我同意你的观点,让我解释一下,我正在从我的控制器中从12个IML中调用~12个IML,9个将调用DB,在平均值中,每个IML将获取~15-20条记录,然后转到mapper并将其设置为Dto。现在你可以想象它为什么会这样~10@VinayHegde好:)我真的希望并行处理能帮助你(尽管默认情况下我持怀疑态度,不是针对个人)。现在,我看到您可能希望将lambda强制转换为Runnable(我这里没有要验证的java)