Java Spring引导在控制器内执行并行方法

Java Spring引导在控制器内执行并行方法,java,multithreading,concurrency,Java,Multithreading,Concurrency,我试图在我的控制器中执行一些并行方法,但是返回类型有一些问题 我有4个方法,每个方法都返回一个列表。我需要以并行方式执行这些方法,然后获取每个返回的列表,并将所有这些列表放在一个映射中,然后从控制器返回该映射。 代码如下: Callable<List> callable1 = new Callable<List>() { @Override public List call() throws E

我试图在我的控制器中执行一些并行方法,但是返回类型有一些问题

我有4个方法,每个方法都返回一个列表。我需要以并行方式执行这些方法,然后获取每个返回的列表,并将所有这些列表放在一个映射中,然后从控制器返回该映射。 代码如下:

Callable<List> callable1 = new Callable<List>()
           {
              @Override
              public List call() throws Exception
              {
                List<SearchResultAutovit> lista;
                lista = scrapperAutovit.searchAutovit(marcaId, modelId, pretDeLa, pretPanaLa, anFabrDeLa, anFabrPanaLa,
                        orasParam);
                 return lista;
              }
           };

           Callable<List> callable2 = new Callable<List>()
           {
              @Override
              public List call() throws Exception
              {
                  List<SearchResultOlx> listaOlx;
                String marcaOlx = marcaId.toLowerCase();
                String modelOlx = modelId.toLowerCase();
                String orasOlx = orasParam.toLowerCase();
                listaOlx = scrapperOlx.searchOlx(marcaOlx, modelOlx, pretDeLa, pretPanaLa, anFabrDeLa, anFabrPanaLa, orasOlx);
                 return listaOlx;
              }
           };

           Callable<List> callable3 = new Callable<List>()
           {
              @Override
              public List call() throws Exception
              {
                List<SearchResultPubli24> listaPubli24;
                String orasPubli24 = orasParam.toLowerCase();
                listaPubli24 = scrapperPubli24.searchPubli24(marcaId, modelId, orasPubli24, anFabrDeLa, anFabrPanaLa, pretDeLa, pretPanaLa);
                 return listaPubli24;
              }
           };

           Callable<List> callable4 = new Callable<List>()
           {
              @Override
              public List call() throws Exception
              {
                 List<SearchResultAutoUncle> listaAutoUncle;
                listaAutoUncle = scrapperAutoUncle.searchAutoUncle(marcaId, modelId, pretDeLa, pretPanaLa, anFabrDeLa, anFabrPanaLa, orasParam);
                 return listaAutoUncle;
              }
           };

           //add to a list
           List<Callable<List>> taskList = new ArrayList<Callable<List>>();
           taskList.add(callable1);
           taskList.add(callable2);
           taskList.add(callable3);
           taskList.add(callable4);

           ExecutorService executor = Executors.newFixedThreadPool(3);
           executor.invokeAll(taskList);

           Map<String,List<?>> listOfWebsites = new HashMap<>();
            listOfWebsites.put("listaAutovit", (List<?>) taskList.get(0));
            listOfWebsites.put("listaOlx", (List<?>) taskList.get(1));
            listOfWebsites.put("listaPubli24", (List<?>) taskList.get(2));
            listOfWebsites.put("listaAutoUncle", (List<?>) taskList.get(3));

        return listOfWebsites;
Callable callable1=new Callable()
{
@凌驾
公共列表调用()引发异常
{
清单a;
lista=scrasterAutovit.searchAutovit(marcaId、modelId、pretDeLa、pretPanaLa、Anfarbandela、Anfarbanala、,
奥拉斯帕兰);
返回列表a;
}
};
Callable callable2=新的Callable()
{
@凌驾
公共列表调用()引发异常
{
列表AOLX;
字符串marcaOlx=marcaId.toLowerCase();
字符串modelOlx=modelId.toLowerCase();
字符串orasOlx=orasParam.toLowerCase();
listaOlx=scrasterolx.searchOlx(marcaOlx、modelOlx、pretDeLa、pretPanaLa、Anfarbadela、Anfarbanala、orasOlx);
返回列表aolx;
}
};
Callable callable3=新的Callable()
{
@凌驾
公共列表调用()引发异常
{
清单24;
字符串orasPubli24=orasParam.toLowerCase();
listaPublis24=scrasterPublis24.searchPublis24(marcaId、modelId、Orapublis24、Anfarbella、Anfarbanala、Pretdella、pretPanaLa);
返回ListaPublis24;
}
};
Callable callable4=新的Callable()
{
@凌驾
公共列表调用()引发异常
{
列出列表A;
listaAutoUncle=报废AutoUncle.searchAutoUncle(marcaId、modelId、pretDeLa、pretPanaLa、Anfarbanala、Anfarbanala、orasParam);
返回listaauto叔叔;
}
};
//添加到列表中
List taskList=new ArrayList();
任务列表.add(callable1);
任务列表。添加(callable2);
任务列表。添加(可调用3);
任务列表。添加(可调用4);
ExecutorService executor=Executors.newFixedThreadPool(3);
执行人:invokeAll(任务列表);

Map我建议使用completableFuture对象和SupplySync方法。 给你的方法如下:

CompletableFuture<String> completableFuture
  = CompletableFuture.supplyAsync(() -> scrapperAutovit.searchAutovit);

CompletableFuture<String> completableFuture1
  = CompletableFuture.supplyAsync(() -> scrapperOlx.searchOlxwith);

CompletableFuture<String> completableFuture2
  = CompletableFuture.supplyAsync(() -> scrapperPubli24.searchPubli24);
CompletableFuture CompletableFuture
=CompletableFuture.SupplySync(()->ScrasterAutovit.searchAutovit);
完整的未来完整的未来1
=CompletableFuture.SupplySync(()->ScraseRolx.searchOlxwith);
完整的未来完整的未来2
=CompletableFuture.supplyAsync(()->scrasterPublis24.SearchPublis24);
将用于检查您是否收到上述电话的回复

这样,您就可以为
scraseRolx.searchOlxwith
scrasePublis24.searchPubli24
completableFuture对象打开并行线程,等待执行完成该任务,然后合并所有数据,您可以进一步处理

有关更多详细信息,请参阅下面的链接

这是理解未来的好例子

我建议将completableFuture对象与SupplySync方法一起使用。 给你的方法如下:

CompletableFuture<String> completableFuture
  = CompletableFuture.supplyAsync(() -> scrapperAutovit.searchAutovit);

CompletableFuture<String> completableFuture1
  = CompletableFuture.supplyAsync(() -> scrapperOlx.searchOlxwith);

CompletableFuture<String> completableFuture2
  = CompletableFuture.supplyAsync(() -> scrapperPubli24.searchPubli24);
CompletableFuture CompletableFuture
=CompletableFuture.SupplySync(()->ScrasterAutovit.searchAutovit);
完整的未来完整的未来1
=CompletableFuture.SupplySync(()->ScraseRolx.searchOlxwith);
完整的未来完整的未来2
=CompletableFuture.supplyAsync(()->scrasterPublis24.SearchPublis24);
将用于检查您是否收到上述电话的回复

这样,您就可以为
scraseRolx.searchOlxwith
scrasePublis24.searchPubli24
completableFuture对象打开并行线程,等待执行完成该任务,然后合并所有数据,您可以进一步处理

有关更多详细信息,请参阅下面的链接

这是理解未来的好例子
首先,更改可调用项的类型以避免强制转换:

    Callable<List<?>> callable1 = new Callable<List>(){...}

就是这样。

首先,更改可调用项的类型以避免强制转换:

    Callable<List<?>> callable1 = new Callable<List>(){...}

就这样。

你什么意思?此代码不在构造函数内。对不起,误读了问题。我在一个嘈杂的房间里。我将删除我的评论。提示
HomeController$1
是您的
可调用的
。。。更一般地说,您应该计划异步执行整个过程,并从控制器方法返回一个
Future
。此外,您所有的列表都是rawtype…您的意思是什么?此代码不在构造函数内。对不起,误读了问题。我在一个嘈杂的房间里。我将删除我的评论。提示
HomeController$1
是您的
可调用的
。。。更一般地说,您应该计划异步执行整个过程,并从控制器方法返回一个
Future
。此外,您的所有列表都是rawtype…我不确定我是否理解:(我应该在哪里使用这个CompletableFuture?你在callable中创建的所有future对象都可以被CompletableFuture使用,就像我提到的一个ScrasterAutovit.searchAutovit的例子一样,你可以与ScrasterOlx.searchOlx并行运行,如此等等,我也分享了一些链接你只要通过这个链接,你就会明白它是一个java8 future对象。注意,这将使用公共池而不是自定义执行器。您也可以通过构造函数提供自定义执行器。公共静态CompletableFuture SupplySync(供应商-供应商,执行器-执行器){return asyncSupplyStage(screenExe