gpt4 book ai didi

java - 如何同时开始一些搜索

转载 作者:行者123 更新时间:2023-12-02 09:48:43 27 4
gpt4 key购买 nike

我目前正在开发一个前端,用于可视化外国系统中的一些搜索结果。目前,程序正在向一个系统询问另一个系统,并且只有在所有外国系统都回答后才继续。前端是用 Vaadin 13 编写的,应该能够通过推送刷新页面。

我有六个 Controller 类可供六个外部系统提问,并且希望同时开始所有问题,而不必等待个别 Controller 完成。

我的问题是我找不到可以帮助我解决这个特殊问题的教程。所有教程都是关于多次但同时启动相同的过程。

这就是我现在开始搜索的方式:

public static void performSingleSearch(ReferenceSystem referenceSystem, String searchField, List<String> searchValues, SystemStage systemStage) throws Exception {

if(!isAvailable(referenceSystem, systemStage)) return;
Map<String, ReferenceElement> result = new HashMap<>();
try {
Class<?> classTemp = Class.forName(referenceSystem.getClassname());
Method method = classTemp.getMethod("searchElements", String.class , List.class, SystemStage.class);
result = (Map<String, ReferenceElement>) method.invoke(classTemp.newInstance(), searchField, searchValues, systemStage);
} catch (Exception e) {
return;
}
if(result != null) orderResults(result, referenceSystem);
}

我希望您能为我提供有关如何使用多线程的教程,或者更好的一本关于多线程的书。

最诚挚的问候丹尼尔

最佳答案

在我看来,最简单的方法是使用CompletableFuture。忽略你对反射的残暴使用,我将假设

interface ReferenceSystem {
public Map<String,ReferenceElement> searchElements(List<String> args);
}

List<ReferenceSystem> systems = getSystems();
List<String> searchArguments = getSearchArguments();

这样你就可以做到

List<CompletableFuture<Map<String, ReferenceElement>>> futures = new ArrayList<>();
for (ReferenceSystem system : systems) {
futures.add(CompletableFuture.supplyAsync(() -> system.searchElements(searchArguments)));
}

或者使用 Java 8 Streams

List<CompletableFuture<Map<String, ReferenceElement>>> futures =
systems.stream()
.map(s -> CompletableFuture.supplyAsync(
() -> system.searchElements(searchArguments)))
.collect(Collectors.toList());

现在,futures 包含一个 futures 列表,最终将返回您要查找的 Map;您可以使用 #get() 访问它们,它将阻塞直到出现结果:

for (CompletableFuture<Map<String,ReferenceElement>> future : futures) {
System.out.printf("got a result: %s%n", future.get());
}

关于java - 如何同时开始一些搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56475217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com