java - 在同步块(synchronized block)中启动新线程

标签 java multithreading synchronized

可能这是一个基本问题,但希望从该论坛获得确认。

我有以下代码逻辑:

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

最佳答案

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

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

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


同时,回到 method4:按照编码,您的拦截将介入,创建 future,然后等待最多 10 秒以让 future 完成。拦截之后返回(完成或超时)。控制权传回方法 1,退出 block /同步循环。

关于java - 在同步块(synchronized block)中启动新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11854778/

相关文章:

c# - 如何在考虑多线程的情况下恰好执行一段代码?

python - 使用GIL和多线程处理嵌入式Python解释器调用

java - 为什么这个线程代码挂起

Java RMI 和线程同步问题

java - 更新 JComboBox 弹出菜单

java - 无法使用 `factory-method` 实例化单例

java - 创建一个随机圆圈,可以像按钮一样单击,但它是一个圆圈

Java 8 Stream API 收集器 - addAll 不适用于参数对象,addAll 未定义类型对象

c++ - 如何在多线程中使用 Lambda 表达式?

java - Servlet 中的线程安全