Java 并行编程-性能改进

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());

我正在用SpringBoot编写一个控制器,我的控制器是这样的

@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是包含某种方法声明的接口,我们从数据库中获取getFirstNamegetLastName,但是getAddress1getAddress2是硬编码值,如何设置前两个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)