前言
成都創(chuàng)新互聯(lián)服務(wù)項目包括順昌網(wǎng)站建設(shè)、順昌網(wǎng)站制作、順昌網(wǎng)頁制作以及順昌網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,順昌網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到順昌省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
之前連續(xù)寫了幾篇關(guān)于使用@Async實現(xiàn)異步調(diào)用的內(nèi)容,也得到不少童鞋的反饋,其中問題比較多的就是關(guān)于返回Future的使用方法以及對異步執(zhí)行的超時控制,所以這篇就來一起講講這兩個問題的處理。
如果您對于@Async注解的使用還不了解的話,可以看看之前的文章,具體如下:
定義異步任務(wù)
首先,我們先使用@Async注解來定義一個異步任務(wù),這個方法返回Future類型,具體如下:
@Slf4j @Component public class Task { public static Random random = new Random(); @Async("taskExecutor") public Futurerun() throws Exception { long sleep = random.nextInt(10000); log.info("開始任務(wù),需耗時:" + sleep + "毫秒"); Thread.sleep(sleep); log.info("完成任務(wù)"); return new AsyncResult<>("test"); } }
Tips:什么是Future類型?
Future是對于具體的Runnable或者Callable任務(wù)的執(zhí)行結(jié)果進(jìn)行取消、查詢是否完成、獲取結(jié)果的接口。必要時可以通過get方法獲取執(zhí)行結(jié)果,該方法會阻塞直到任務(wù)返回結(jié)果。
它的接口定義如下:
public interface Future{ boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
它聲明這樣的五個方法:
也就是說Future提供了三種功能:
測試執(zhí)行與定義超時
在完成了返回Future的異步任務(wù)定義之后,我們來嘗試實現(xiàn)一個單元測試來使用這個Future完成任務(wù)的執(zhí)行,比如:
@Slf4j @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class ApplicationTests { @Autowired private Task task; @Test public void test() throws Exception { FuturefutureResult = task.run(); String result = futureResult.get(5, TimeUnit.SECONDS); log.info(result); } }
上面的代碼中,我們在get方法中還定義了該線程執(zhí)行的超時時間,通過執(zhí)行這個測試我們可以觀察到執(zhí)行時間超過5秒的時候,這里會拋出超時異常,該執(zhí)行線程就能夠因執(zhí)行超時而釋放回線程池,不至于一直阻塞而占用資源。
完整示例:
讀者可以根據(jù)喜好選擇下面的兩個倉庫中查看Chapter4-1-4項目:
Github:https://github.com/dyc87112/SpringBoot-Learning/
Gitee:https://gitee.com/didispace/SpringBoot-Learning/
本地下載:http://xiazai.jb51.net/201805/yuanma/SpringBoot-Learning(jb51.net).rar
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。