gpt4 book ai didi

java - Spring中如何正确使用@Async

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:49:58 24 4
gpt4 key购买 nike

我对 Spring 的 @Async 注解以及如何正确使用它有疑问。假设我有这些方法:

@Async
public void test(String param1) {
test2(param1, null);
}

@Async
public void test2(String param1, String param2) {
test3(param1, param2, null);
}

@Async
public void test3(String param1, String param2, String param3) {
// do some heavy work
}

我是否需要在所有三种方法上都使用 @Async 才能异步调用它,还是只在 test3 上使用它就足够了? ?

最佳答案

您确实只需要一种方法。只是因为,在使用第一个 @Async 方法启动新线程后,它与调用方法是异步的。

但这对你意味着什么,很大程度上取决于你的例子应该说明什么:

1) 因此,在您的情况下,当您调用 test2 时,test1(String param1)@Async 就足够了test3test1

@Async
public void test1(String param1) {
test2(param1, null);
}

private void test2(String param1, String param2) {
test3(param1, param2, null);
}

private void test3(String param1, String param2, String param3) {
// do something
}

注意方法2和3是私有(private)的


2) 但是,如果您的示例是为了说明默认参数 (Method chaining) 的方法重载模式,那么它会更加复杂。然后,您需要在执行实际操作的方法中使用 @Async 注释。因为您只想以异步方式执行真正的执行,而不是为每个链接步骤执行一次异步调用。

public void test(String param1) {
test(param1, null);
}


public void test(String param1, String param2) {
//this invocation runs async only when real AspectJ is used
test(param1, param2, null);
}

@Async
public void test(String param1, String param2, String param3) {
// do something
}

请注意,所有方法都被命名为 test(方法链接模式)

问题在于,如果通过 this 调用 Spring(没有真正的 AspectJ 加载或编译时织入)将不会运行异步方法! (参见 https://stackoverflow.com/a/22561903/280244)

关于java - Spring中如何正确使用@Async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33994634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com