【发布时间】:2021-12-01 01:07:15
【问题描述】:
我使用的是 Java 1.7。
我正在尝试同时执行两种方法。但是,每种方法都有不同的返回类型。
我有以下:
private ExecutorService executorService = Executors.newFixedThreadPool(2);
private void executeConcurrentTasks(final boolean autoBookingEnabled, final TripDTO tripDTO, final ApprovalRequestDetails approvalRequestDetails, final ApprovalRequest approvalRequest, final QuoteResponse quoteResponse, final TripRequirementsResponse tripRequirementsResponse, final List<List<Evaluator>> evaluatorsList, final List<EvaluationApprovalTree> evaluationTree, final Long memberId, final Map<String,Object> properties, final HttpSession session) {
List<Callable<?>> tasks = Arrays.asList(
new Callable<BookServicesResponse>() {
public BookServicesResponse call() throws Exception {
BookServicesResponse autoBookResponse = bookServices(autoBookingEnabled, tripDTO, approvalRequestDetails, approvalRequest, quoteResponse, memberId, properties, session);
return autoBookResponse;
}
},
new Callable<ApprovalResponse>() {
public ApprovalResponse call() throws Exception {
ApprovalResponse approvalResponse = submitApproval(approvalRequest, tripDTO, tripRequirementsResponse, evaluatorsList, evaluationTree, memberId, properties, session);
return approvalResponse;
}
});
List<Future<?>> futures = executorService.invokeAll(tasks); // compile error
for (Future<?> future : futures) {
try {
Object obj = future.get();
if (obj instanceof BookServicesResponse) {
// ...
} else if (obj instanceof ApprovalResponse) {
// ...
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
编译错误:
问题
是否有一种通用的方式来处理这两个方法的调用,使得返回的期货列表每个都有不同的对象?
【问题讨论】:
-
如果您要将它们全部放入一个列表中,那么也许您应该使用
List<Callable<Object>>(当然也可以使用new Callable<Object>(){...}实例化您的可调用对象。无论如何,这不会是最糟糕的部分, 因为你已经必须转换了。就打字而言,我认为invokeAll最适合统一类型的可调用对象。
标签: java concurrency threadpool executorservice