<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 1. 異步方法內依然是同步的 異步方法的方法內依然是同步的,方法外才是異步的。如下示例。 **1. 異步方法** ```java @Slf4j @Service public class AsyncService { @Async public void async02() { String name = "zhangsan"; log.info("AsyncService -> async02 -> name001({})", name); try { Thread.sleep(5000); name = "wangwu"; log.info("AsyncService -> async02 -> name002({})", name); } catch (InterruptedException e) { e.printStackTrace(); } log.info("AsyncService -> async02 -> name003({})", name); } } ``` **2. 同步方法調用異步方法** ```java @Slf4j @RestController public class AsyncController { @Autowired AsyncService asyncService; @GetMapping("/sync02") public void sync02() { log.info("AsyncController -> sync02 -> 001"); //同步方法中調用異步方法 asyncService.async02(); log.info("AsyncController -> sync02 -> 002"); } } ``` 日志打印順序如下。 ``` 2022-09-07 11:08:36 : AsyncController -> sync02 -> 001 2022-09-07 11:08:36 : AsyncController -> sync02 -> 002 2022-09-07 11:08:36 : AsyncService -> async02 -> name001(zhangsan) -- 等待5s輸出下面內容 2022-09-07 11:08:41 : AsyncService -> async02 -> name002(wangwu) 2022-09-07 11:08:41 : AsyncService -> async02 -> name003(wangwu) ``` <br/> # 2. 引起@Async失效的情況 轉載自:https://zhuanlan.zhihu.com/p/462544527 **** * 異步方法使用static修飾。 * 異步類沒有使用@Component注解(或其他注解)導致spring無法掃描到異步類。 * 異步方法被同類的方法(異步/同步)調用會失效。 * 類中需要使用@Autowired或@Resource等注解自動注入,不能自己手動new對象。 * 如果使用SpringBoot框架必須在啟動類中增加@EnableAsync注解。 * 異步方法將Future作為返回值。 <br/> # 3. @Async的原理簡述 轉載自:https://blog.csdn.net/qq_44750696/article/details/123960134 **** @Async 的原理是通過 Spring AOP 動態代理的方式來實現的。 <br/> Spring 容器啟動初始化 bean 時,判斷類中是否使用了 @Async 注解,如果使用了則為其創建切入點和切入點處理器,根據切入點創建代理。 <br/> 在線程調用 @Async 注解標注的方法時,會調用代理,執行切入點處理器`invoke`方法,將方法的執行提交給線程池中的另外一個線程來處理,從而實現了異步執行。 <br/> 所以,需要注意的一個錯誤用法是,如果 A 方法(不論是同步還是異步)調用它同類中標注 @Async 的 B 方法,是不會異步執行的,因為從 A 方法進入調用的都是該類對象本身,不會進入代理類。因此,<mark>相同類中的方法調用帶 @Async 的方法是無法異步的,這種情況仍然是同步</mark>。 <br/> # 4. 異步方法返回值 **1. 調用異步方法是獲取不到該異步方法的返回值的** ```java // 異步方法 @Async public String async03() { String name = "zhangsan"; log.info("AsyncService -> async03 -> name001({})", name); try { Thread.sleep(5000); name = "wangwu"; log.info("AsyncService -> async03 -> name002({})", name); } catch (InterruptedException e) { e.printStackTrace(); } log.info("AsyncService -> async03 -> name003({})", name); return name; } // 調用異步方法 @GetMapping("/sync03") public String sync03() { log.info("AsyncController -> sync03 -> 001"); //同步方法中調用異步方法 String name = asyncService.async03(); log.info("AsyncController -> sync03 -> name({})", name); return name; } ``` 日志打印順序如下: ``` 2022-09-07 12:03:33 : AsyncController -> sync03 -> 001 2022-09-07 12:03:33 : AsyncController -> sync03 -> name(null) 2022-09-07 12:03:33 : AsyncService -> async03 -> name001(zhangsan) -- 等待5s打印如下內容 2022-09-07 12:03:38 : AsyncService -> async03 -> name002(wangwu) 2022-09-07 12:03:38 : AsyncService -> async03 -> name003(wangwu) ``` <br/> **2. 如果非要獲取異步方法的返回值,可以返回Future類,但是這個方法就不再是異步方法了** ```java // 異步方法,返回值為Future @Async public Future<String> async04() { String name = "zhangsan"; log.info("AsyncService -> async04 -> name001({})", name); try { Thread.sleep(5000); name = "wangwu"; log.info("AsyncService -> async04 -> name002({})", name); } catch (InterruptedException e) { e.printStackTrace(); } log.info("AsyncService -> async04 -> name003({})", name); return new AsyncResult<>(name); } // 調用異步方法 @GetMapping("/sync04") public String sync04() throws ExecutionException, InterruptedException { log.info("AsyncController -> sync04 -> 001"); //同步方法中調用異步方法 String name = asyncService.async04().get(); log.info("AsyncController -> sync04 -> name({})", name); return name; } ``` 日志打印順序如下,說明異步沒有執行。 ``` 2022-09-07 12:07:08 : AsyncController -> sync04 -> 001 2022-09-07 12:07:08 : AsyncService -> async04 -> name001(zhangsan) 2022-09-07 12:07:13 : AsyncService -> async04 -> name002(wangwu) 2022-09-07 12:07:13 : AsyncService -> async04 -> name003(wangwu) 2022-09-07 12:07:13 : AsyncController -> sync04 -> name(wangwu) ``` >[warning]&nbsp;&nbsp;1. 雖然不能獲取異步方法的返回值,但是異步方法的返回值可以不是void。<br/> &nbsp;&nbsp;2. 只能返回引用類型,不能返回基本數據類型。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看