【发布时间】:2021-12-02 17:59:20
【问题描述】:
我正在使用 Java 7。
我有一个方法我想在一个新线程中执行(异步)并允许其余的进程继续。但是,我有以下代码,但它仍然同步执行。
executeBookingAndApprovalConcurrently(autoBookingEnabled, tripDTO, approvalRequestDetails, approvalRequest, quoteResponse, tripRequirementsResponse, evaluatorsList, evaluationTree, memberId, properties, session);
logger.log(Level.INFO, "Executed booking and approval requests in a new thread." );
和
private void executeBookingAndApprovalConcurrently(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) {
Callable<Void> taskBookAndApprove = new Callable<Void>() {
public Void call() {
executeBookingAndApproval(autoBookingEnabled, tripDTO, approvalRequestDetails, approvalRequest, quoteResponse, tripRequirementsResponse, evaluatorsList, evaluationTree, memberId, properties, session);
return null;
}
};
Future<Void> futureBookAndApprove = executorService.submit(taskBookAndApprove);
try {
futureBookAndApprove.get();
} catch (InterruptedException e) {
logger.log(Level.SEVERE, "InterruptedException Error calling executeBookingAndApproval in a new thread.", e);
} catch (ExecutionException e) {
logger.log(Level.SEVERE, "ExecutionException Error calling executeBookingAndApproval in a new thread.", e);
}
}
和
private void executeBookingAndApproval(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) {
// do stuff that takes a long time
logger.log(Level.INFO, "Called executeBookingAndApproval successfully in a new thread.");
}
我想打印:
在新线程中执行预订和批准请求。
在新线程中成功调用 executeBookingAndApproval。
但它按以下顺序打印:
在新线程中成功调用 executeBookingAndApproval。
在新线程中执行预订和批准请求。
【问题讨论】:
-
Future#get()块。 -
@sp00m 感谢您的回复。如果
.get()阻塞,我应该使用什么? -
你可以删除这一行。触发工作的不是
Future#get(),而是executorService#submit()。
标签: java multithreading callable