Java 如何在不阻塞当前代码路径的情况下获取ExecutorService的执行结果?
我有一个服务,它向Callables添加一组请求,然后打印执行结果。当前,服务请求被阻止,直到我打印执行的所有未来结果。但是,我希望将200返回给请求者,并在不阻塞请求的情况下并行运行这些请求。我怎样才能做到这一点?下面是我的代码 下面是我运行并行代码的代码Java 如何在不阻塞当前代码路径的情况下获取ExecutorService的执行结果?,java,multithreading,java-8,future,executorservice,Java,Multithreading,Java 8,Future,Executorservice,我有一个服务,它向Callables添加一组请求,然后打印执行结果。当前,服务请求被阻止,直到我打印执行的所有未来结果。但是,我希望将200返回给请求者,并在不阻塞请求的情况下并行运行这些请求。我怎样才能做到这一点?下面是我的代码 下面是我运行并行代码的代码 public void runParallelFunctions(Callable<Map<String, String>> invokerTask) { List<Callable<Ma
public void runParallelFunctions(Callable<Map<String, String>> invokerTask) {
List<Callable<Map<String, String>>> myTasks = new ArrayList<>();
for (int i = 0; i < invocationCount; i++) {
myTasks.add(invokerTask);
}
List<Future<Map<String, String>>> results = null;
try {
results = executorService.invokeAll(myTasks);
} catch (InterruptedException e) {
}
this.printResultsFromParallelInvocations(results);
}
在上面的代码中,我调用createAdditionalCandidatesForFuture
,然后返回true。但是代码仍然等待printResultsFromParallelInvocations
方法完成。调用createAdditionalCandidatesForFuture
后,如何在不等待结果打印的情况下返回代码?我必须使用另一个executor线程打印结果,还是有其他方法?任何帮助都将不胜感激答案是
更新的运行并行函数
:
public void runparallel函数(可调用invokerTask){
//编写一个包装器来处理CompletableFuture之外的异常
供应商任务供应商=()->{
试一试{
//一些需要很长时间的任务
睡眠(4000);
返回invokerTask.call();
}捕获(例外e){
系统输出打印ln(e);
}
//错误时返回默认值
返回新的HashMap();
};
对于(int i=0;i<5;i++){
CompletableFuture.SupplySync(taskSupplier,executorService)
.thenAccept(此::printResultsFromParallelInvocations);
}
//主线程在运行完循环后立即到达这里
System.out.println(“做其他工作…”);
}
而且,printResultsFromParallelInvocations
可能看起来像:
private void printResultsFromParallelInvocations(映射结果){
result.forEach((key,value)->System.out.println(key+“:”+value));
}
输出:
做其他工作。。。。
//4秒等待
关键词:价值
在未来
上调用get
将阻止线程,直到任务完成,因此是的,您必须将结果打印移动到另一个线程/执行器服务
另一种选择是,每个任务在完成时打印其结果,前提是为其提供必要的工具(访问记录器等)。或者换一种方式说,每个任务分为两个连续的步骤:执行和打印。非常感谢,这就是我要找的!你有没有可能帮上忙?
private void printResultsFromParallelInvocations(List<Future<Map<String, String>>> results) {
results.forEach(executionResults -> {
try {
executionResults.get().entrySet().forEach(entry -> {
LOGGER.info(entry.getKey() + ": " + entry.getValue());
});
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
});
}
String documentToBeIndexed = GSON.toJson(indexDocument);
int documentId = indexMyDocument(documentToBeIndexed);
createAdditionalCandidatesForFuture(someInput);
return true;