Java 如何在不阻塞当前代码路径的情况下获取ExecutorService的执行结果?

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

我有一个服务,它向Callables添加一组请求,然后打印执行结果。当前,服务请求被阻止,直到我打印执行的所有未来结果。但是,我希望将200返回给请求者,并在不阻塞请求的情况下并行运行这些请求。我怎样才能做到这一点?下面是我的代码

下面是我运行并行代码的代码

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;