如何使用并行编程使以下代码运行更快?

时间:2018-12-19 14:27:44

标签: java multithreading spring-mvc spring-boot java-ee

我正在使用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是其中包含一些方法声明的接口,我们从数据库中获取 getFirstName getLastName ,但是 getAddress1 getAddress2 是硬编码的值,如何使前两个setter(firstname和lastname)在一个线程中运行,最后两个setter(Address1和Address2)并行在另一个线程中运行,这样我可以减少时间来获取我的数据。

2 个答案:

答案 0 :(得分:2)

  

这里有逻辑,SomeImpl将从数据库中获取约15条记录,然后将其发送到mapper,mapper将从15个中过滤约5个字段,然后将这5个值设置为Dto。

您需要预先指定

从数据库中获取15条记录需要10秒钟..这太过分了。我仍然猜到问题出在其他地方,除非您证明不然

在这里,我们假设并行处理将为您提供帮助(线程切换和管理所需的时间少于每次操作)。请注意,从数据库并行读取数据可能对您的帮助比预期的要差。换句话说-这是并行执行操作的方法,但我仍然不相信这会解决您的问题。

您可能真的从评论中阅读了资源

  

一种解决方案是使用CompleatableFuture检索详细信息        并将它们设置为dto。选中Guide To CompletableFuture       有关详细信息– Valentin Carnu

您可以将执行程序服务与固定线程池一起使用

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

我脑子里写的没有正确验证语法,但是你应该有主意

答案 1 :(得分:-2)

如果你想要的话

您可以用new Thread().start()来换行,但这可能比现在更慢。试试:

Mydto=new MyDto();
new Thread(() -> {
     dto.setFirstName(someImpl.getFirstName());
     dto.setLastName(someOtherImpl.getLastName());
}).start();

new Thread(() -> {
     dto.setAddress1(someImpl.getAddress1());
     dto.setAddress2(someOtherImpl.getAddress2());
}).start();
return dto;