2012-08-07 120 views
2

可能这是一个基本问题,但希望从此论坛获得确认。在同步块内启动一个新线程

我有下面的代码逻辑:

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

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 
+0

你是从另一个线程开始的,但你不是马上等待它吗? – Gray 2012-08-07 22:07:33

+0

这很容易,你可以运行它,看看会发生什么。尝试一下! – 2012-08-07 22:07:53

+0

好的。我试着让method4()在无限循环中运行,并在10秒后超时[我的超时限制]。所以method1()肯定会等待线程完成其执行。我没有得到代码中的错误。无论如何,使线程异步? – gad 2012-08-07 22:22:51

回答

2

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

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

所以,第一个问题:这是你真的想要发生什么?也许不......可能。如果可以安全地在异步块之外处理,则将其移出所述块。如果它不安全,那么你可能想要做的是拦截(和线程)method1


同时,回:作为编码的,在你的拦截措施,创造未来,然后等待长达10秒的未来完成。此后截获(完成或超时)。控制权返回到方法1,退出块/同步循环。

+0

如果我没有同步块,method1()会立即返回吗? – gad 2012-08-07 23:05:28

+0

@Ganesh不会有效。 – oldrinb 2012-08-07 23:08:41

+0

感谢您的帮助。如果我不等将来,method1立即返回。 – gad 2012-08-07 23:17:32