可能这是一个基本问题,但希望得到此论坛的确认。
我有以下代码逻辑:
public Object method1() {
synchronized(this) {
method2();
method3();
method4();
}
method4()
是一项耗时的操作,我不必等待它的完成。所以我写了一个spring方法拦截器,它将拦截method4
调用并在一个单独的线程中执行它。现在我的问题是在方法4执行开始后,method1会立即返回吗?
以下是拦截器代码:
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Future<Object> future = executorService.submit(new AsyncCallable(
methodInvocation));
Object retVal = null;
try {
retVal = future.get(10, TimeUnit.SECONDS);
} catch (Exception e) {
logger.error("Exception while running the method Async", e);
throw e;
}
return retVal;
} //AsyncCallable implements Callable interface
答案 0 :(得分:2)
陈述:method4()
是一项耗时的操作,我不必等待它的完成。
好的,线程是一个很好的解决方案。但是,通过这个声明,你已经建议你想要的是立即返回,这将立即退出同步块。
所以,第一个问题:这是你真的想要发生的吗?也许不是......也许吧。如果在同步块之外处理method4
是安全的,则将其移出所述块。如果它不安全,那么你想要做的就是截取(和线程)method1
?
同时,回到method4
:按照编码,您的拦截步入,创建未来,然后等待最多10秒,以便将来完成。拦截在此之后返回(完成或超时)。控制传递回方法1,退出块/同步循环。