Java 在同步块中启动新线程

Java 在同步块中启动新线程,java,multithreading,synchronized,Java,Multithreading,Synchronized,也许这是一个基本的问题,但我想得到这个论坛的确认 我有以下代码逻辑: public Object method1() { synchronized(this) { method2(); method3(); method4(); } method4()是一个耗时的操作,我不必等待它的完成。因此,我编写了一个spring方法拦截器,它将拦截method4调用,并在单独的线程中执行它。现在我的问题是method1会在Method4执行开始后立即返回吗 以下是拦截器代码: public

也许这是一个基本的问题,但我想得到这个论坛的确认

我有以下代码逻辑:

public Object method1() {
 synchronized(this) {
  method2();
  method3();
  method4();
}
method4()
是一个耗时的操作,我不必等待它的完成。因此,我编写了一个spring方法拦截器,它将拦截
method4
调用,并在单独的线程中执行它。现在我的问题是method1会在Method4执行开始后立即返回吗

以下是拦截器代码:

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
公共对象调用(MethodInvocation MethodInvocation)抛出可丢弃的{
Future=executorService.submit(新的异步调用(
方法调用);
Object retVal=null;
试一试{
retVal=future.get(10,时间单位为秒);
}捕获(例外e){
logger.error(“运行异步方法时出现异常”,e);
投掷e;
}
返回返回;
}//AsyncCallable实现可调用接口
声明:
method4()
是一个耗时的操作,我不必等待它的完成

好的,线程是一个很好的解决方案。然而,就在这句话中,您已经指出您想要的是立即返回,这将立即退出同步块

所以,第一个问题:这是你真正想要的吗?也许不是。。。大概如果在同步块外处理
method4
是安全的,则将其移出所述块。如果它不安全,那么您可能想做的是拦截(并执行线程)
method1



同时,返回到
method4
:按照编码,您的截取步骤进入,创建未来,然后等待10秒钟,等待未来完成。截获在此之后返回(完成或超时)。控件传递回method1,退出块/同步化循环。

您正在另一个线程中启动它,但不是立即等待它吗?这很简单,您可以运行它并查看发生了什么。试试看!好啊我试着让method4()在无限循环中运行,它在10秒后超时[我的超时限制]。因此method1()肯定会等待线程完成其执行。我不明白代码中有什么错误。还有什么方法可以使线程异步吗?@Ganesh当然,如果你不等待
未来的
@Ganesh,你说:“method1()肯定会等待线程完成它的执行”。不,没有。它等待
method4
返回,超时后返回。线程无限循环(如您所述),并继续运行。如果我没有同步块,method1()会立即返回吗?谢谢您的帮助。如果我不等待将来,method1会立即返回。@Ganesh您的问题强烈表明您可能不清楚synchronize关键字的含义/用途。你可以去读一下。