我正在使用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)并行在另一个线程中运行,这样我可以减少时间来获取我的数据。
答案 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;