2

可能这是一个基本问题,但想从这个论坛得到确认。

我有以下代码逻辑:

public Object method1() {
 synchronized(this) {
  method2();
  method3();
  method4();
}

method4()是一项耗时的操作,我不必等待其完成。所以我写了一个spring方法拦截器,它将拦截method4调用并在单独的线程中执行它。现在我的问题是方法 4 执行开始后方法 1 会立即返回吗?

下面是拦截器代码:

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
4

1 回答 1

2

声明:method4()是一项耗时的操作,我不必等待其完成。

好的,线程是一个很好的解决方案。但是,通过该声明,您已经建议您想要立即返回,这将立即退出同步块。

所以,第一个问题:这是你真正想要发生的事情吗?也许不是……也许。如果method4在同步块之外处理是安全的,则将其移出所述块。如果它不安全,那么也许您想要做的是拦截(和线程)method1


同时,回到method4:按照编码,您的拦截介入,创建未来,然后等待长达 10 秒以等待未来完成。之后拦截返回(完成或超时)。控制传递回方法 1,退出块/同步循环。

于 2012-08-07T22:20:42.640 回答