Java中的@Async異步功能詳解
Java中的@Async異步功能詳解
@Async注解,可以實現(xiàn)異步處理的功能,它可以有返回值,或者直接在新線程時并行執(zhí)行一個任務(wù),對于異步來說,它的執(zhí)行是有條件的,你需要把異步代碼塊放在單獨的類里,當(dāng)spring在注入時,才不會相互影響,因為異步是一個比較特殊的代理。
異步入口
@EnableAsync
具體的異步方法
/** * 異常的類型應(yīng)該和同步執(zhí)行的類分開,這樣在ioc建立時不會相互干擾 */ @Service public class MessageService { @Async public void msg1() throws Exception { Thread.sleep(5000L); System.out.println("async1:" + LocalDateTime.now() + ",id:" + Thread.currentThread().getId()); } }
上面代碼中的異步,是一個沒有返回值的,一般像發(fā)送消息可以采用這種方式。
帶有返回值的異步
@Async public Future<String> asyncMethodWithReturnType() { System.out.println("Execute method asynchronously - " + Thread.currentThread().getName()); try { Thread.sleep(5000); return new AsyncResult<String>("hello world !!!!"); } catch (InterruptedException e) { // } return null; }
這種會返回一個委托對象Future,我們?nèi)绻M玫剿姆祷貢r,需要在主程序中去監(jiān)聽它,就是寫在循環(huán),去等待它的返回結(jié)果。
Future<String> future = messageService.asyncMethodWithReturnType(); while (true) { ///這里使用了循環(huán)判斷,等待獲取結(jié)果信息 if (future.isDone()) { //判斷是否執(zhí)行完畢 System.out.println("Result from asynchronous process - " + future.get()); break; } System.out.println("Continue doing something else. "); System.out.println("main end:" + LocalDateTime.now() + ",id:" + Thread.currentThread().getId()); }
上面代碼主程序在執(zhí)行到異步方法時,由于遇到了while(true),所以會租塞,直到有返回結(jié)果為止。
到此這篇關(guān)于Java中的@Async異步功能詳解的文章就介紹到這了,更多相關(guān)@Async異步功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個文件無法傳輸多個問題
這篇文章主要介紹了解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個文件無法傳輸多個問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08淺談synchronized方法對非synchronized方法的影響
下面小編就為大家?guī)硪黄獪\談synchronized方法對非synchronized方法的影響。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10

IDEA中Java出現(xiàn)無效的源發(fā)行版錯誤的解決辦法