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