Spring项目中的多线程无法正常工作

时间:2019-07-03 10:28:36

标签: java spring multithreading asynchronous

例如,我需要在其余函数得到执行的情况下,在一个完整的独立线程上运行一个函数

public void a(){
// do dome work
}

public void b(){
// do dome work
a()
return "hello"
}

我需要我的代码开始破坏函数a,但不等待函数a结束就返回问候

我尝试了带有spring和@Async批注的任务执行器,但注意到正在工作

public static String mainMEthod() {
    asyncMethodWithReturnType();
    return "hello";

}

@Async
public static Future<String> asyncMethodWithReturnType() {
    for (int i = 0; i < 10; i++) {
        System.out.println("Execute method asynchronously - " + 
        Thread.currentThread().getName());
    }
    try {
        Thread.sleep(5000);
        return new AsyncResult<String>("hello world !!!!");
    } catch (InterruptedException e) {
        //do anything
    }
    return null;
}

以下是输出:

Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main
Execute method asynchronously - main

但它不应在主线程上运行

3 个答案:

答案 0 :(得分:3)

@Async有两个限制:

  1. 必须仅将其应用于公共方法
  2. 自调用– 从同一类中调用异步方法–无法正常工作

原因很简单–该方法需要公开,以便可以代理。而且自调用不起作用,因为它会绕过代理并直接调用基础方法。

还请确保正确配置:

@Configuration
@EnableAsync
public class SpringAsyncConfig { ... }

了解更多:

https://www.baeldung.com/spring-async

答案 1 :(得分:0)

如果调用方在同一个bean中,则.container{ width: 600px; height: 400px; overflow: hidden; display: -webkit-flex; } .left{ background: cyan; } .right{ background: orange; overflow: auto; height: 100%; } .sticky{ position: sticky; position: -webkit-sticky; text-align: center; top: 0; background: inherit; } 不能在单独的线程中运行。

所以方法之一是将@Async方法移至另一个bean,然后从a()调用它

或者,当我们需要类似的东西时,考虑做我们在Spring Boot项目中所做的事情:

b()

答案 2 :(得分:0)

Spring添加Async之类的功能(除了this之类的许多其他功能)的方式是通过创建并注入具有提供这些功能逻辑的代理。 在您的情况下,Spring无法拦截对asyncMethodWithReturnType的调用,因为这是没有中间Spring托管代理的普通Java方法调用。有关更多信息,您可以查看here